本文只針對c#中,多執行緒同步所用到的鎖(lock)作為研究物件。由於想更直觀的顯示結果,所以,在做demo的時候,就把多執行緒通過事件操作ui的**也寫了出來,留作備忘和分享吧。
其實多執行緒的同步,使用同步鎖的方法用了好多次,今天無意中看到msdn中,建議用:
1 private static readonly object locker1 = new object();
2 private readonly object locker2 = new object();
備註:原文並沒有加readonly,是我後來自己加進去的。
我不僅思考了一下他們的區別。
然後我寫了一段**進行測試,測試類**如下:
複製**
///
/// 跨執行緒操作ui的時候傳遞的引數,本文為了顯示訊息,所以簡單的封裝了乙個
///
public class myeventargs : eventargs
}///
/// 測試類,用於測試2種鎖的區別
///
public class locktest
//要鎖的變數,通過它可以看出2種鎖在不同情況下的效果
private int num = 0;
//例項名字
private readonly string name;
public locktest(string name)
//第一種鎖執行的方法
public void addnum1()
}//第二種鎖執行的方法
public void addnum2()
}//鎖內的一些操作,並通過事件,把關鍵的訊息顯示到主線程中的ui裡
private void showmessage()
],例項中num的值是", thread.currentthread.name, this.name, num);
onmessage(new myeventargs(msg));
thread.sleep(100);
}msg = string.format("*****=執行緒 執行完畢*****=", thread.currentthread.name);
onmessage(new myeventargs(msg));}}
複製**
測試用的類寫完了,開始測試:
首先測試單個例項、多執行緒,2種鎖的區別:
private void button1_click(object sender, eventargs e)
}private void button2_click(object sender, eventargs e)
}輸出結果一模一樣:
得出結論:如果對乙個例項,多執行緒訪問的時候,2種鎖是沒有區別的。
下面是測試多個例項的情況(靜態鎖):
複製**
private void button3_click(object sender, eventargs e)
}複製**
得到結果:
得出結論,在靜態鎖面前,執行緒依舊要排隊,雖然不是乙個例項,但是鎖是唯一的,執行緒只認鎖,所以執行緒並沒有併發!
繼續測試(非靜態的鎖):
複製**
private void button4_click(object sender, eventargs e)
}複製**
得到的結果:
得出結論:非靜態鎖的時候,多執行緒併發了,一起在工作。
其實,測試的結果之前也能猜想出來,只不過,不測試下,心裡總是覺得沒底,呵呵,測試完了,也就徹底釋然了!
窗體中,用於事件**,顯示到ui裡的**在這裡:
複製**
delegate void messagehandler(string msg);
public void messagecallback(object sender, myeventargs e));}
public void showmessage(string msg)
python執行緒中的執行緒鎖Lock物件
原語鎖定 或互斥鎖定 是乙個同步原語,狀態是 已鎖定 或者 未鎖定 之一。兩個方法 acquire 和 release 用於修改鎖定的狀態。如果狀態已鎖定,嘗試獲取鎖定將被阻塞,直到鎖定被釋放為止。如果有多個執行緒等待獲取鎖定,當鎖定釋放時,只有乙個執行緒能獲得它。等待執行緒獲得鎖定的順序沒有定義。...
C 執行緒Lock鎖 只能鎖定物件
一.為什麼要lock,lock了什麼?當我們使用執行緒的時候,效率最高的方式當然是非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要同步 機制了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作都是有...
C 關於多執行緒及執行緒同步 lock鎖的應用
form1.cs using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using syst...