有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行。

还有就是一个被lock的方法递归调用会不会死锁,因为需要lock同一个变量。答案当然是不会死锁。

下面是一个测试demo

  1. class Program
  2. {
  3. private static object a = new object();
  4. private static object b = new object();
  5. private static object c = new object();
  6. private static Hashtable list = Hashtable.Synchronized(new Hashtable());
  7.  
  8. static void Main(string[] args)
  9. {
  10. //所有i不相等的线程将同步执行并返回结果
  11. new Thread(new ParameterizedThreadStart(delegate(object obj) {
  12. Test(, );
  13. Console.WriteLine("");
  14. })).Start();
  15.  
  16. new Thread(new ParameterizedThreadStart(delegate(object obj)
  17. {
  18. Test(, );
  19. Console.WriteLine("1+");
  20. })).Start();
  21.  
  22. //所有i==2的线程将顺序执行
  23. new Thread(new ParameterizedThreadStart(delegate(object obj)
  24. {
  25. Test(, );
  26. Console.WriteLine("");
  27. })).Start();
  28.  
  29. new Thread(new ParameterizedThreadStart(delegate(object obj)
  30. {
  31. Test(, );
  32. Console.WriteLine("");
  33. })).Start();
  34.  
  35. new Thread(new ParameterizedThreadStart(delegate(object obj)
  36. {
  37. Test(, );
  38. Console.WriteLine("");
  39. })).Start();
  40.  
  41. new Thread(new ParameterizedThreadStart(delegate(object obj)
  42. {
  43. Test(, );
  44. Console.WriteLine("");
  45. })).Start();
  46.  
  47. new Thread(new ParameterizedThreadStart(delegate(object obj)
  48. {
  49. Test(, );
  50. Console.WriteLine("");
  51. })).Start();
  52.  
  53. //两次lock同一变量不会死锁
  54. new Thread(new ParameterizedThreadStart(delegate(object obj)
  55. {
  56. Test2(, );
  57. Console.WriteLine("");
  58. })).Start();
  59.  
  60. Console.ReadKey();
  61. }
  62.  
  63. /// <summary>
  64. /// 对于i相同的线程进行阻塞保证不会并行多个
  65. /// </summary>
  66. /// <param name="i"></param>
  67. /// <param name="j"></param>
  68. public static void Test(int i,int j)
  69. {
  70. if (!list.ContainsKey(i))
  71. list.Add(i, DateTime.Now);
  72.  
  73. lock (list[i])
  74. {
  75. Thread.Sleep(j);
  76. }
  77. }
  78.  
  79. //多次lock同一变量测试是否会死锁
  80. public static void Test2(int i, int j, bool isFirstRun = true)
  81. {
  82. if (!list.ContainsKey(i))
  83. list.Add(i, DateTime.Now);
  84.  
  85. lock (list[i])
  86. {
  87. Thread.Sleep(j);
  88. if (isFirstRun)
  89. Test2(i, j, false);
  90. }
  91. }
  92. }

程序输出如下:

  1. +

多线程线性 lock的更多相关文章

  1. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  2. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  3. 多线程中lock用法的经典实例

    多线程中lock用法的经典实例 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...

  4. c/c++ 多线程 std::lock

    多线程 std::lock 当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个.同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...) 额外说明: ...

  5. c#多线程中Lock()关键字的用法小结

    本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助     本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段 ...

  6. c#中多线程同步Lock(锁)的研究以及跨线程UI的操作

    本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...

  7. C++开发过程多线程同步lock的实现

    在程序开发过程经常使用到多线程,而多线程始终与锁存在紧密地联系,以下详细的介绍如何在C++程序开发过程中自定义锁的几种方法. 1. 下面给出一段代码展现如何通过Mutex实现锁的功能(window p ...

  8. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

    在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...

  9. Java多线程的~~~Lock接口和ReentrantLock使用

    在多线程开发.除了synchronized这个keyword外,我们还通过Lock接口来实现这样的效果.由Lock接口来实现 这样的多线程加锁效果的优点是非常的灵活,我们不在须要对整个函数加锁,并且能 ...

随机推荐

  1. IO多路复用,select、poll、epoll 编程主要步骤

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. 戴尔poweredge r730服务器配置以及系统安装

    第一次给服务器安装的是ubantu系统: 首先我们开机进入小型BIOS设置一下RAID,或者进入服务器管理系统,在系统的BIOS中进行RAID设置: 开机后当看到出现< Ctrl > &l ...

  3. Java语法基础学习DayEight

    一.异常处理 1.结构 java.lang.Object |-----java.lang.Throwable |-----java.lang.Error:错误,java程序对此无能为力,不显式处理 | ...

  4. 用Filter实现图片防盗链

    首先继承自FilterAttribute类同时实现IActionFilter接口,代码如下: //// <summary> /// 防盗链Filter. /// </summary& ...

  5. [Paper] LCS: An Efficient Data Eviction Strategy for Spark

    Abstract Classical strategies do not aware of recovery cost, which could cause system performance de ...

  6. L251

    Beer before wine, or wine before beer; whatever the order, you’ll feel queer. That, at least, is the ...

  7. Unity3D使用OpenFileDialog后崩溃

    http://ask.unitymanual.com/question/24922 找了很久,原来是我的dll文件引错了,名字都一样,应该引用unity安装目录下的System.Window.Form

  8. Delphi 10.3.1来了

    10.3.1发布了,这个版本可以独自安装,是对Delphi 10.3 Rio,C ++ Builder 10.3 Rio和RAD Studio 10.3 Rio的更新.如果安装了2018年11月发布的 ...

  9. mysql主从复制-读写分离

    mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...

  10. 《统计学习方法》笔记(3):k近邻

    k近邻(KNN)是相对基本的机器学习方法,特点是不需要建立模型,而是直接根据训练样本的数据对测试样本进行分类. 1.k近邻的算法? 算法对测试样本进行分类的一般过程如下: 1)根据给定的k值,搜索与测 ...