概念
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語句,更加方便,自動獲取鎖,自動釋放,這樣可以...