多執行緒程式設計系列學習之 lock關鍵字

2021-09-13 16:21:12 字數 1939 閱讀 5867

概念

lock 語句獲取給定物件的互斥 lock,執行語句塊,然後釋放 lock。 持有 lock 時,持有 lock 的執行緒可以再次獲取並釋放 lock。 阻止任何其他執行緒獲取 lock 並等待釋放 lock。

lock 只適用單機情況,分布式和負債均衡可以考慮分布式鎖。

形式lock(this)lock(string)lock(object)lock(staticobject)

測試**:

class program

static void test(locktype locktype)

static void orderpay(string orderid, int threadno, locktype locktype)

} public class payment

public void pay(locktype locktype)

break;

case locktype.lockstring:

lock (lockstring)

break;

case locktype.lockobject:

lock (lockobj)

break;

case locktype.lockstaticobject:

lock (staticlockobj)

break;

}showmessage("釋放鎖");

}private void showaction()

private void showmessage(string message)

的第個執行緒 ", lockstring, threadno, message));

}} public enum locktype

lock(this)結果:

可以看出lock(this),如果this是個普通的類非靜態非單例,那麼lock(this)並不滿足我們的需求,甚至除了當前執行緒並看不出有任何作用。

lock(string) 結果:

lock(lockstring) 從結果上來看比較契合要求,但是由於crl針對string特殊字串駐留機制,針對相同字串值的不同字串變數對均指向同乙個託管堆中記憶體塊。可能會造成後期類似訂單支付同樣的業務拓展所帶來的衝突,訂單的訂單id與其他業務的標識id字串值相同,這樣會導致不同業務間的執行緒互斥

lock(object) 結果:

可以通過 typeof 運算子或反射獲取從而改變物件,本質和lock(this)一樣

lock(staticobject) 結果:

lock(staticobject) 實現了對於同一筆的訂單執行緒互斥,但是不符合的是對於不同筆的訂單同樣進行了互斥。

總結當同步對共享資源的執行緒訪問時,請鎖定專用物件例項(例如,private readonly object balancelock = new object();)或另乙個不太可能被**無關部分用作 lock 物件的例項。 避免對不同的共享資源使用相同的 lock 物件例項,因為這可能導致死鎖或鎖爭用。 具體而言,避免將以下物件用作 lock 物件

多執行緒系列學習 ABA問題

aba問題,描述的是乙個變數v,它的值經歷a b a的變化,導致看起來好像沒有變一樣,其實,第二次出現的a已經不是第一次出現的a了,是被修改過的。下面復現aba問題,並解決 測試 public class abatest catch interruptedexception e 執行緒a看到的那個0...

多執行緒系列九 lock

public inte ce lock即在不同方法中呼叫lock,獲得的都是物件鎖。public class conditiontest catch interruptedexception e finally system.out.println after await public void s...

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

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