C 學習筆記 lock鎖的解釋與用法

2022-02-16 07:27:56 字數 1495 閱讀 5766

前幾時在寫業務**的時候,看到有用到lock這個方法的,而我竟然並不知道是做什麼用的,所以查詢了許多部落格文章,弄懂了百分之七八十,在此做下筆記。

感謝部落格  的解說,該篇部落格大部分內容源自於此。

官方msdn的說法:

lock 關鍵字可確保當乙個執行緒位於**的臨界區時,另乙個執行緒不會進入該臨界區。 如果其他執行緒嘗試進入鎖定的**,則它將一直等待(即被阻止),直到該物件被釋放。

lock 關鍵字在塊的開始處呼叫 enter,而在塊的結尾處呼叫 exit。 threadinterruptedexception 引發,如果 interrupt 中斷等待輸入 lock 語句的執行緒。

通常,應避免鎖定 public 型別,否則例項將超出**的控制範圍。

最經常使用的是下面的**段:

private

static

readonly

object objlock = new

object

();lock

(objlock )

對於為什麼鎖私有,我覺得部落格  上的乙個例子寫的很好:

以廁所為例,私有就好比,廁所的鎖只有你能訪問到,而且最好這把鎖不會因為外力而有所改變,別人訪問不到,這樣才能保證你進去了,別人就進不去了,如果是公有的,就好比你蹲位小單間的鎖不是安裝在裡面而是安裝在外邊的,別人想不想進就不是你所能控制的了,這樣也不安全。

在多執行緒中,每個執行緒都有自己的資源,但是**區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。

lock是不能鎖值型別。

string也是應用型別,從語法上來說是沒有錯的。

但是鎖定字串尤其危險,因為字串被公共語言執行庫 (clr)「暫留」。

這意味著整個程式中任何給定字串都只有乙個例項,就是這同乙個物件表示了所有執行的應用程式域的所有執行緒中的該文字。

因此,只要在應用程式程序中的任何位置處具有相同內容的字串上放置了鎖,就將鎖定應用程式中該字串的所有例項。

通常,最好避免鎖定 public 型別或鎖定不受應用程式控制的物件例項。

例如,如果該例項可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的**也可能會鎖定該物件。

這可能導致死鎖,即兩個或更多個執行緒等待釋放同一物件。

出於同樣的原因,鎖定公共資料型別(相比於物件)也可能導致問題。

而且lock(this)只對當前物件有效,如果多個物件之間就達不到同步的效果。lock(typeof(class))與鎖定字串一樣,範圍太廣了。

總結一下好了:

1、lock的是引用型別的物件,string型別除外。

2、lock推薦的做法是使用靜態的、唯讀的、私有的物件。

3、保證lock的物件在外部無法修改才有意義,如果lock的物件在外部改變了,對其他執行緒就會暢通無阻,失去了lock的意義。

4、學海無涯,不斷補充自己才是最重要的!努力吧

Lock鎖與synchronized鎖的區別

1 synchronized鎖是可以幫助我們自動開鎖和關閉鎖 2 lock鎖,我們最常用的是reentrantlock重入鎖,需要我們手動的開鎖和手動關鎖 3 synchronized只能與wait notify 方法一起使用 4 reentrantlock只能與condition類中的await ...

C 併發用鎖 Lock關鍵字處理

lock 關鍵字將語句塊標記為臨界區,方法是獲取給定物件的互斥鎖,執行語句,然後釋放該鎖。lock語句根本使用的就是monitor.enter和monitor.exit,也就是說lock this 時執行monitor.enter this 大括號結束時執行monitor.exit this 他的意...

python多執行緒程式設計與學習(鎖Lock)

你需要對多執行緒程式中的臨界區加鎖以避免競爭條件。例如只有一台印表機,但卻有兩個以上的輸入程式,這個時候印表機就是競爭資源。如何解決,給印表機上鎖,使用印表機時上鎖,使用完解鎖。在python中使用 threading 庫中的 lock 物件 用with語句,更加方便,自動獲取鎖,自動釋放,這樣可以...