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