[C#.NET][Thread] 執行緒同步資源鎖定 – lock / SyncLock

[C#.NET][Thread] 執行緒同步資源鎖定 – lock / SyncLock

使用執行緒時常會共用一些資源(方法),為了不讓執行緒同時間進入同一個資源,避免造成資源在演算過程中發生錯亂,可以使用關鍵字C# for lock / VB for SyncLock來鎖定資源,等待執行緒工作完成後才會自動解除鎖定,讓其它的執行緒進來使用資源,如果其他執行緒嘗試進入已鎖定的程式碼,它將會等候、封鎖,直到該物件被釋出;這算是一種簡單的鎖定方式,若你的方法是共用且需要鎖定,那這種鎖定或許就能成為你的選擇。

msdn上建議我們在鎖定是最好是定義要鎖定的 private 物件,或者定義 private static 物件變數保護所有執行個體通用的資料。

private static object _thisLock = new object();
lock (_thisLock)
{
   //TODO
}

基本上這是一個很簡單的用法,接下來我只是要驗証,它在等待中的生命週期,我寫了簡單的code,我在DoWorker方法用了Sleep(10000)是模擬這個工作花了很多時間,方便觀察執行緒狀態。
image

 

我們可以看到最先進入到DoWorker的是編號12的執行緒,其他的執行緒狀態則是WaitSleepJoin,等到編號12狀態變成Stopped後,編號11才能進入DoWorker方法裡,依此類推下去。

image

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo