a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

C#中使用Lock關鍵字進行線程同步

2023-05-17 11:41:55
字體:
來源:轉載
供稿:網友

lock 關鍵字可以用來確保代碼塊完成運行,而不會被其他線程中斷。這是通過在代碼塊運行期間為給定對象獲取互斥鎖來實現的。

lock 語句以關鍵字 lock 開頭,它有一個作為參數的對象,在該參數的后面還有一個一次只能由一個線程執(zhí)行的代碼塊。例如:

public void Function()
{
    System.Object lockThis = new System.Object();
    lock(lockThis)
    {
        // Access thread-sensitive resources.
    }
}

提供給 lock 關鍵字的參數必須為基于引用類型的對象,該對象用來定義鎖的范圍。在上例中,鎖的范圍限定為此函數,因為函數外不存在任何對該對象的引用。

嚴格地說,提供給 lock 的對象只是用來唯一地標識由多個線程共享的資源,所以它可以是任意類實例。然而,實際上,此對象通常表示需要進行線程同步的資源。例如,如果一個容器對象將被多個線程使用,則可以將該容器傳遞給 lock,而 lock 后面的同步代碼塊將訪問該容器。只要其他線程在訪問該容器前先鎖定該容器,則對該對象的訪問將是安全同步的。

通常,最好避免鎖定 public 類型或鎖定不受應用程序控制的對象實例。例如,如果該實例可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的代碼也可能會鎖定該對象。這可能導致死鎖,即兩個或更多個線程等待釋放同一對象。出于同樣的原因,鎖定公共數據類型(相比于對象)也可能導致問題。鎖定字符串尤其危險,因為字符串被公共語言運行庫 (CLR)“暫留”。這意味著整個程序中任何給定字符串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字符串上放置了鎖,就將鎖定應用程序中該字符串的所有實例。因此,最好鎖定不會被暫留的私有或受保護成員。某些類提供專門用于鎖定的成員。例如,Array 類型提供 SyncRoot。許多集合類型也提供 SyncRoot。

所以,使用lock應該注意以下幾點:

(1)如果一個類的實例是public的,最好不要lock(this)。因為使用你的類的人也許不知道你用了lock,如果他new了一個實例,并且對這個實例上鎖,就很容易造成死鎖。

(2)如果MyType是public的,不要lock(typeof(MyType))

(3)永遠也不要lock一個字符串

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久亚洲精品中文字幕 | 激情91 | 成人欧美一区二区三区黑人麻豆 | 亚洲一区不卡 | 夜夜爽99久久国产综合精品女不卡 | www.欧美日韩 | 国产在线观 | 久久久免费 | 黄色片在线播放 | 亚洲蜜臀av乱码久久精品蜜桃 | 久久久久18 | 三级视频网| 日本黄色一级片免费看 | 国产精品久久久久久久久久99 | 久草一级| 欧美全黄 | 亚洲成人自拍 | 国产成人高清视频 | 久久免费视频国产 | 国产欧美精品一区二区三区 | 在线一区二区视频 | 成人片网址 | 欧美在线播放一区 | 日韩国产精品视频 | 粉嫩一区二区三区 | 日本综合色 | 日韩精品一区二区三区四区 | 欧美亚洲一区二区三区 | 亚洲一区二区三区免费在线观看 | 五月天在线婷婷 | www.亚洲| 日韩高清中文字幕 | 久久久久国产精品免费免费搜索 | 4hu影视 | 91玖玖| 亚洲骚片| 亚洲免费小视频 | 男人的天堂亚洲 | 特黄一级 | 黄色毛片免费看 | 男人的天堂在线视频 |