C#多线程的用法4-线程间的协作lock快捷方式
线程间协作还可通过lock(加锁)方式进行,lock属于C#的Monitor语法糖(Monitor后续讲解)。使用简单快捷,如下:
/// <summary>
/// 多线程协作-lock快捷方式
/// 成功解决多线程对单一资源的共享
/// </summary>
private static void MultiThreadSynergicWithLock()
{
int[] array = new int[3]; Thread producer = new Thread(() =>
{
int count = 0;
Random random = new Random();
while (true)
{
if (10 == count)
break; lock (array)
{
array[0] = random.Next(10);
array[1] = random.Next(10);
array[2] = random.Next(10);
count++;
Console.WriteLine(String.Format("{0} work count:{1}。{2}-{3}-{4}", Thread.CurrentThread.Name, count, array[0], array[1], array[2]));
}
Thread.Sleep(100);
}
})
{
Name = "producer"
};
Thread customer = new Thread(() =>
{
//Console.WriteLine(String.Format("{0} start work", Thread.CurrentThread.Name));
int count = 0;
while (true)
{
if (10 == count)
break;
lock (array)
{
count++;
Console.WriteLine(String.Format("{0} work count:{1}。{2}-{3}-{4}", Thread.CurrentThread.Name, count, array[0], array[1], array[2]));
array[0] = 0;
array[1] = 0;
array[2] = 0;
}
Thread.Sleep(10);
}
})
{
Name = "customer"
}; producer.Start();
customer.Start();
}
说明:
1、通过lock成功解决了多个线程对同一资源的共享使用问题,确保一个线程在lock到资源后,另外需要资源的线程只能处于等待状态。
2、lock并不能解决线程间顺序执行的问题(线程顺序执行是指:要求线程A,B满足,A先执行,B再执行,A又执行,B再次执行这种交替模式)
C#多线程的用法4-线程间的协作lock快捷方式的更多相关文章
- C#多线程的用法8-线程间的协作AutoResetEvent
AutoResetEvent自动重置事件,与ManualResetEvent是相对的而言.它同样用于线程间同步,请对照<C#多线程的用法7-线程间的协作ManualResetEvent>进 ...
- C#多线程的用法3-线程间的协作Join
在创建多线程应用程序时,如何确保线程间的协作往往比让线程工作更重要. 线程间的协作最简单的方式是采用Join来进行,如下: /// <summary> /// 多线程协作-Join方式 / ...
- C#多线程的用法5-线程间的协作Monitor
之前我们使用lock快捷方式,实现了多线程对同一资源的共享.在C#中lock实际上是Monitor操作的简化版本. 下面使用Monitor来完成之前的lock功能,你可以在此做一下对照: privat ...
- C#多线程的用法7-线程间的协作ManualResetEvent
ManualResetEvent:手动重置事件,它用于线程间同步时用法非常简单也易于理解. private static void MultiThreadSynergicWithManualReset ...
- C#多线程的用法6-线程间的协作Mutex
Mutex在线程协作的过程中起互斥的左右,效果与线程锁类似. /// <summary> /// 多线程协作-Mutex /// </summary> private stat ...
- Java并发之线程间的协作
上篇文章我们介绍了synchronized关键字,使用它可以有效的解决我们多线程所带来的一些常见问题.例如:竞态条件,内存可见性等.并且,我们也说明了该关键字主要是一个加锁和释放锁的集成,所有为能获得 ...
- java并发之线程间通信协作
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- 【转】Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线 ...
随机推荐
- Python 3从入门到精通01-环境搭建
本系列开始介绍Python3的基础教程,为什么要选中Python 3呢?因为最近看到一些资料和课程,都是Python 3授课的,例如,大数据,机器学习,数据挖掘等等:还有一个目的,我想彻底地,系统地学 ...
- centos6.5下redis安装步骤总结
1.首先下载一个版本 我用的是3.2.9 解压:tar -zxvf /redis-stable.tar.gz 在/usr/local/新建redis文件夹 然后把解压好的文件夹移动到/usr/loca ...
- 大数据平台搭建-kafka集群的搭建
本系列文章主要阐述大数据计算平台相关框架的搭建,包括如下内容: 基础环境安装 zookeeper集群的搭建 kafka集群的搭建 hadoop/hbase集群的搭建 spark集群的搭建 flink集 ...
- Java之初识
今天开始学习Java 1.什么是Java? Java是1995年由sun公司推出的一门极富创造力的面向对象编程语言,是由Java之父詹姆斯格斯林博士设计的. Java名字的由来:据说,java刚刚设计 ...
- Spring Data JPA 复杂/多条件组合查询
1: 编写DAO类或接口 dao类/接口 需继承 public interface JpaSpecificationExecutor<T> 接口: 如果需要分页,还可继承 public ...
- 第一章:eclipse 中修改字体大小和编码格式
eclipse 中修改字体大小的步骤: 1. 在 eclipse 的工具栏中,找到 weindows 下面的 preferences 2. 在 preferences 的 输出 font ,在 Bas ...
- sleep() 和 wait() 有什么区别?
sleep()方法是使线程停止一段时间的方法.在sleep 时间间隔期满后,线程不一定立即恢复执行.这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非"醒来"的 ...
- python+matplotlib+web.py
最近看了厦门大学数据库实验室林子雨老师的<大数据课程实验案例:网站用户行为分析>,可视化这块是用的R语言,我决定用Python来实现一下. 参考文献 http://dblab.xmu.ed ...
- Java之异常处理,日期处理
Java异常处理 异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描 ...
- Java并发编程(2):线程中断(含代码)
使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...