lock(锁)


简单的说,lock就是锁定它所包含的语句

lock("s"){num++;}      双引号中的是引用类型,不能用值类型

这一句被锁定后,其他的当lock("  "),引号中如果是和上面lock(" ")引号中的 堆地址是一样的话,

后执行lock的将不能执行,进入等待中,直到CPU为他分配的时间用完后,跳出,接着执行第一次执行lock的语句。

当第一次执行的lock中的语句执行完了,将释放  “”双引号中的  字符串 和 {}中的资源

例:

 1  int num = 0;
 2             Thread t1 = new Thread(() =>
 3             {
 4                 for (int i = 0; i < 1000000; i++)
 5                 {
 6                     lock ("s")//
 7                     {
 8                         num++;
 9                     }
10                 }
11                 Console.WriteLine(num);
12             })
13             {
14                 IsBackground = true//设为后台线程
15             };
16             t1.Start();//开启线程
17            

为什么用lock

例:当有两个线程访问同一个区域是,

两个线程都是执行的赋值语句

当一个线程执行到赋值语句时(比如:n=100;num=n;),CPU为该线程分配的时间用完了;开始执行另一个线程,该线程也是赋值语句,当执行完赋值语句时(例如:n=10;num=n;),

执行完这条语句时 num的值应该为 10,但是这个线程分配的时间用完后,在执行上一个线程时,将接着执行赋值语句,也就是(n=100,num=n;)得到的结果num等于100;

这和预期的结果不符

而使用lock就是解决这个问题的

例如:如下图就可以完美的解决问题

 1  int num = 0;
 2             Thread t1 = new Thread(() =>
 3             {
 4                 for (int i = 0; i < 1000000; i++)
 5                 {
 6                     lock ("s")//
 7                     {
 8                         num++;
 9                     }
10                 }
11                 Console.WriteLine(num);
12             })
13             {
14                 IsBackground = true//设为后台线程
15             };
16             t1.Start();//开启线程
17             Thread t2 = new Thread(() =>
18             {
19                 for (int i = 0; i < 1000000; i++)
20                 {
21                     lock ("s")//
22                     {
23                         num--;
24                     }
25                 }
26                 Console.WriteLine(num);
27             })
28             {
29                 IsBackground = true//设为后台线程
30             };
31             t2.Start();//开启线程
32             Thread.Sleep(1000);//暂停(挂起)多少 毫秒
33             Console.WriteLine(num);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM