多线程线性 lock
有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行。
还有就是一个被lock的方法递归调用会不会死锁,因为需要lock同一个变量。答案当然是不会死锁。
下面是一个测试demo
- class Program
- {
- private static object a = new object();
- private static object b = new object();
- private static object c = new object();
- private static Hashtable list = Hashtable.Synchronized(new Hashtable());
- static void Main(string[] args)
- {
- //所有i不相等的线程将同步执行并返回结果
- new Thread(new ParameterizedThreadStart(delegate(object obj) {
- Test(, );
- Console.WriteLine("");
- })).Start();
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test(, );
- Console.WriteLine("1+");
- })).Start();
- //所有i==2的线程将顺序执行
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test(, );
- Console.WriteLine("");
- })).Start();
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test(, );
- Console.WriteLine("");
- })).Start();
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test(, );
- Console.WriteLine("");
- })).Start();
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test(, );
- Console.WriteLine("");
- })).Start();
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test(, );
- Console.WriteLine("");
- })).Start();
- //两次lock同一变量不会死锁
- new Thread(new ParameterizedThreadStart(delegate(object obj)
- {
- Test2(, );
- Console.WriteLine("");
- })).Start();
- Console.ReadKey();
- }
- /// <summary>
- /// 对于i相同的线程进行阻塞保证不会并行多个
- /// </summary>
- /// <param name="i"></param>
- /// <param name="j"></param>
- public static void Test(int i,int j)
- {
- if (!list.ContainsKey(i))
- list.Add(i, DateTime.Now);
- lock (list[i])
- {
- Thread.Sleep(j);
- }
- }
- //多次lock同一变量测试是否会死锁
- public static void Test2(int i, int j, bool isFirstRun = true)
- {
- if (!list.ContainsKey(i))
- list.Add(i, DateTime.Now);
- lock (list[i])
- {
- Thread.Sleep(j);
- if (isFirstRun)
- Test2(i, j, false);
- }
- }
- }
程序输出如下:
- +
多线程线性 lock的更多相关文章
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- 多线程中lock用法的经典实例
多线程中lock用法的经典实例 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...
- c/c++ 多线程 std::lock
多线程 std::lock 当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个.同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...) 额外说明: ...
- c#多线程中Lock()关键字的用法小结
本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- C++开发过程多线程同步lock的实现
在程序开发过程经常使用到多线程,而多线程始终与锁存在紧密地联系,以下详细的介绍如何在C++程序开发过程中自定义锁的几种方法. 1. 下面给出一段代码展现如何通过Mutex实现锁的功能(window p ...
- Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...
- Java多线程的~~~Lock接口和ReentrantLock使用
在多线程开发.除了synchronized这个keyword外,我们还通过Lock接口来实现这样的效果.由Lock接口来实现 这样的多线程加锁效果的优点是非常的灵活,我们不在须要对整个函数加锁,并且能 ...
随机推荐
- IO多路复用,select、poll、epoll 编程主要步骤
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 戴尔poweredge r730服务器配置以及系统安装
第一次给服务器安装的是ubantu系统: 首先我们开机进入小型BIOS设置一下RAID,或者进入服务器管理系统,在系统的BIOS中进行RAID设置: 开机后当看到出现< Ctrl > &l ...
- Java语法基础学习DayEight
一.异常处理 1.结构 java.lang.Object |-----java.lang.Throwable |-----java.lang.Error:错误,java程序对此无能为力,不显式处理 | ...
- 用Filter实现图片防盗链
首先继承自FilterAttribute类同时实现IActionFilter接口,代码如下: //// <summary> /// 防盗链Filter. /// </summary& ...
- [Paper] LCS: An Efficient Data Eviction Strategy for Spark
Abstract Classical strategies do not aware of recovery cost, which could cause system performance de ...
- L251
Beer before wine, or wine before beer; whatever the order, you’ll feel queer. That, at least, is the ...
- Unity3D使用OpenFileDialog后崩溃
http://ask.unitymanual.com/question/24922 找了很久,原来是我的dll文件引错了,名字都一样,应该引用unity安装目录下的System.Window.Form
- Delphi 10.3.1来了
10.3.1发布了,这个版本可以独自安装,是对Delphi 10.3 Rio,C ++ Builder 10.3 Rio和RAD Studio 10.3 Rio的更新.如果安装了2018年11月发布的 ...
- mysql主从复制-读写分离
mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...
- 《统计学习方法》笔记(3):k近邻
k近邻(KNN)是相对基本的机器学习方法,特点是不需要建立模型,而是直接根据训练样本的数据对测试样本进行分类. 1.k近邻的算法? 算法对测试样本进行分类的一般过程如下: 1)根据给定的k值,搜索与测 ...