学习心得,为的是让新人能理解,高手直接绕~

lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

引用一句看到的资料里比较流行的话“前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。”

建一个控制台应用程序

首先引用这个.....

using System.Threading;

  1. class ThreadInterrupt
  2. {
  3. static void Main()
  4. {
  5. test tt = new test();
  6. ///写这么多个为的是让环境更加容易创造出氛围来,线程多起来,出问题的可能性就大
  7. new Thread(new ThreadStart(tt.test1)).Start();
  8. new Thread(new ThreadStart(tt.test1)).Start();
  9. new Thread(new ThreadStart(tt.test1)).Start();
  10. new Thread(new ThreadStart(tt.test1)).Start();
  11. new Thread(new ThreadStart(tt.test1)).Start();
  12. new Thread(new ThreadStart(tt.test1)).Start();
  13. new Thread(new ThreadStart(tt.test1)).Start();
  14. new Thread(new ThreadStart(tt.test1)).Start();
  15. new Thread(new ThreadStart(tt.test1)).Start();
  16. new Thread(new ThreadStart(tt.test1)).Start();
  17. new Thread(new ThreadStart(tt.test1)).Start();
  18. new Thread(new ThreadStart(tt.test1)).Start();
  19. new Thread(new ThreadStart(tt.test1)).Start();
  20. new Thread(new ThreadStart(tt.test1)).Start();
  21. new Thread(new ThreadStart(tt.test1)).Start();
  22. new Thread(new ThreadStart(tt.test1)).Start();
  23. new Thread(new ThreadStart(tt.test1)).Start();
  24. new Thread(new ThreadStart(tt.test1)).Start();
  25. new Thread(new ThreadStart(tt.test1)).Start();
  26. new Thread(new ThreadStart(tt.test1)).Start();
  27. new Thread(new ThreadStart(tt.test1)).Start();
  28. new Thread(new ThreadStart(tt.test1)).Start();
  29. new Thread(new ThreadStart(tt.test1)).Start();
  30. new Thread(new ThreadStart(tt.test1)).Start();
  31. new Thread(new ThreadStart(tt.test1)).Start();
  32. new Thread(new ThreadStart(tt.test1)).Start();
  33. new Thread(new ThreadStart(tt.test1)).Start();
  34. new Thread(new ThreadStart(tt.test1)).Start();
  35.  
  36. }
  37. class test
  38. {
  39. private int a;
  40. private object b;
  41. public test()
  42. {
  43. a = ;
  44. b = new object();
  45. }
  46.  
  47. public void test1()
  48. {
  49.  
  50. //////在该位置加lock(this){
  51.  
  52. ///没有lock的情况下,所有线程都会实时进入(线程是无序的)
  53. Console.WriteLine("the thread:{0} 进入 ...", Thread.CurrentThread.GetHashCode());
  54. /////然后每个线程都会去判断a的值
  55. if (a == )
  56. {
  57. Console.WriteLine("a={0},b={1},当前进程{2}", a, b, Thread.CurrentThread.GetHashCode());
  58. return;
  59. }
  60. ///到此,如果线程哈希值不是4,则休眠一秒钟,为的是让晚于线程4但是已经判断a!=0的线程再次停留,给线程4充分的事件去把a置为0
  61. if (Thread.CurrentThread.GetHashCode() != )
  62. {
  63. Thread.Sleep();
  64. }
  65. /////用当前线程的哈希值除a,为的是如果a为0的话能出现异常,当然可以随便写 110/a,907867869/a都可以
  66. b = (Thread.CurrentThread.GetHashCode() / a).ToString();
  67. ///每个线程进入时对a做一些改变,无关紧要的
  68. a -= Thread.CurrentThread.GetHashCode();
  69. ///如果线程哈希值是4,则将a置为0。
  70. if (Thread.CurrentThread.GetHashCode() == )
  71. {
  72. a = ;
  73. }
  74.  
  75. Console.WriteLine("a={0},b={1},当前进程{2}", a, b, Thread.CurrentThread.GetHashCode());
  76.  
  77. //////lock的 "}"
  78. }
  79.  
  80. }
  81.  
  82. }

C#线程中LOCK的意义的更多相关文章

  1. 一个线程中lock用法的经典实例

    /* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ...

  2. 理解C#的Lock语法意义

    一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当 ...

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

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

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

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

  5. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  6. Python进阶(3)_进程与线程中的lock(线程中互斥锁、递归锁、信号量、Event对象、队列queue)

    1.同步锁 (Lock) 当全局资源(counter)被抢占的情况,问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为“线程不安全”.在开发过 ...

  7. C#中的线程(中)-线程同步

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  8. .NET中lock的使用方法及注意事项

    lock就是把一段代码定义为临界区,所谓临界区就是同一时刻只能有一个线程来操作临界区的代码,当一个线程位于代码的临界区时,另一个线程不能进入临界区,如果试图进入临界区,则只能一直等待(即被阻止),直到 ...

  9. Python并发编程之谈谈线程中的“锁机制”(三)

    大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL( ...

随机推荐

  1. django helloworld

    http://note.youdao.com/noteshare?id=8f0b036922e71c1feb5d0d06a4779c6f

  2. js控件实现修改预览的功能

    http://nytimes.github.io/ice/demo/ https://johnresig.com/projects/javascript-diff-algorithm/

  3. react-redux provider组件

    provider组件概念图   react-redux provider组件概念图 provider组件的作用 provider包裹在根组件外层,使所有的子组件都可以拿到state.示例: impor ...

  4. keys随机生成

    随机keys生成 const fs=require('fs'); const KEY_LEN=1024; const KEY_COUNT=2048; const CHARS='abcdefghijkl ...

  5. Java利用PushbackReader实现返回对文本中的指定字符串之前的内容

    import java.io.FileReader; import java.io.PushbackReader; public class PushbackTest { public static ...

  6. __getattriute__

    # class Foo: # def __init__(self,x): # self.x = x # def __getattr__(self,item): # print("__geta ...

  7. 【Python开发】urllib2异常处理

    一.urllib2模块回顾 urllib2模块中最重要的函数是urlopen()函数,用于获取URLs资源(Uniform Resorce Locators).urlopen函数不仅可以用于简单的情况 ...

  8. 【Spring 基础】通过注解注入Bean

    原课程:通过注解注入Bean 注入bean知识点思维导图 Spring 4.x推荐使用基于构造器的方式进行bean注入7.4.1 Dependency Injection spring为什么推荐使用构 ...

  9. PTA(Basic Level)1087.有多少不同的值

    当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: ...

  10. Java小知识----List复制:浅拷贝与深拷贝

    原文地址: https://blog.csdn.net/demonliuhui/article/details/54572908 List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式 ...