多线程线性 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接口来实现 这样的多线程加锁效果的优点是非常的灵活,我们不在须要对整个函数加锁,并且能 ...
随机推荐
- 一些做vue前端的经验
1.先赋值,后渲染 场景:表格渲染中,一般都是这样把json的东西传给table的 this.tableData = json.data.rows 然后的话我们一般会在渲染前对json中的数据做一些转 ...
- day02 运算符和编码
今日所学 主要是运算符和编码的初认识, 1 还有比较运算 ==,!=,<>,>,<,>=,<=等 2 . 赋值运算 =,+=,-=等 还有今天的难点逻辑运算 ...
- TTL特殊门电路
集电极开路(OC)门:主要作用实现线与功能:用做驱动器:实现电平转换 三态输出(TS)门:应用于计算机总线结构,通过分时控制三态门始轮端使得cpu与不同的外设通信:应用于双向传输,实现门电路与总线实现 ...
- Docker小白从零入门实战
环境:Centos 6.9 0.查看是否满足安装需求. 先检查服务器环境,docker要求操作系统CentOS6以上,kernel 版本必须2.6.32-431或更高,即>=CentOS 6.5 ...
- ssh 免密登陆
A 要免密码登录要B 那么需要在A电脑上使用命令 ssh-keygen -t rsa 在~/.ssh/ 目录下生成id_rsa.pub 这个文件,然后将这个文件的内容拷到B电脑de ~/.ssh/au ...
- L253 Work and Pleasure
To be really happy and really safe, one ought to have at least two or three hobbies, and they must a ...
- leetcode55:跳跃游戏
解题思路1: 从头往后找每一个为0的元素,判断这个0能够跳过,所有的0都能跳过,则返回True,否则返回False 解题思路2: 从前往后遍历数组,设置一个访问到当前位置i时最远可调到的距离maxle ...
- django面试题必知
Django的Model的继承有几种形式,分别是什么?(私信小编001 .002 .003 .007任何一个即可获取Python学习资料) 一.抽象继承: 这种继承的定义方法如下: 上例中,我们的Hu ...
- JAVA测试编程
本周我们上JAVA课的时候进行了一次测试,本次测试以模拟中国工商银行自助机ATM的功能为大致要求,要求我们进行编写调试,以求达到试题要求. 测试要求我们能模拟ATM的功能设计,当用户插卡后显示,输入密 ...
- mybatis-generator eclipse插件 使用方法
mybatis-generator eclipse插件离线安装包 网址:http://download.csdn.net/download/gxl442172663/7624747 云盘地址:http ...