在使用多線程的時候,往往存在一定的公共數據,為了避免多個線程同時操作同一數據,我們需要為線程加鎖。
加鎖的原理:
每一個引用類型的對象都有一個同步索引塊,指示當前使用該對象的線程數,每個線程執行到Lock語句塊的時候就會判斷當前鎖定項(這裡是this,當前窗體對象)的同步索引塊是否等於0(即沒有線程在訪問該變量),如果等於0則進入執行塊,首先將同步索引塊的索引加1,表示當前多了一個線程使用this,等lock塊執行完成再將同步索引塊中的索引值減1,使得其它線程能夠繼續訪問,這樣就相當於實現了一個排隊機制,使得在適當的時候該串行執行的代碼串行執行。
我們可以利用lock語句為線程加鎖。示例代碼如下:
需要鎖定對象:lock(this)
需要鎖定代碼段:Object obj = new Object(); lock(obj){…}
我們還可以利用lock語句的語法糖Monitor來實現,示例代碼如下:
class Control { private object obj=new object(); public void Method() { Monitor.Enter(obj); try {......} catch(Excetion ex) {......} finally { Monitor.Exit(obj); } } }
至此,這個初級的多線程入門系列完成了。後面隨著對多線程認識的加深,我們再來進行補充。