簡單的說,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);