简单的说,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);