天天看點

線程鎖Lock ,Rlock

鎖的引入:

我們檢視官方文檔:​​https://docs.python.org/3/library/threading.html#lock-objects​​

​原語鎖:threading.​

​​

​Lock​

實作原始鎖對象的類。一旦線程擷取了鎖,随後的嘗試将其阻塞,直到釋放為止。任何線程都可以釋放它。

重入鎖:​

​threading.​

​​

​RLock​

此類實作可重入鎖定對象。可重入鎖必須由擷取它的線程釋放。一旦一個線程獲得了可重入鎖,同一線程就可以再次獲得它而不會阻塞。線程必須在每次擷取它後釋放一次。

可重入鎖是一個同步原語,可以由同一線程多次擷取。在内部,除了原始鎖使用的鎖定/解鎖狀态外,它還使用“擁有線程”和“遞歸級别”的概念。在鎖定狀态下,某些線程擁有該鎖;在解鎖狀态下,沒有線程擁有它。

為什麼要引入鎖?,我們來看一個線程全局共享變量的例子:

假設現在有一個需求,需要處理商品秒殺活動,修改資料庫的商品數量,我們對于這個變量不做所處理讓線程去修改

線程鎖Lock ,Rlock

 運作結束後可以看到原本商品被兩個線程操作,一個負責good +1 一個負責-1,循環同樣的次數,發現agoods出現了一個讓人意外的的資料:

這就暴露出了問題,當我們嘗試多線程修改一些共享記憶體的變量資料時,就會出現問題,這就需要我們引入鎖的概念,從代碼角度分析要想解決這個問題我們必須對線程每次修改變量操作進行加鎖,每次隻能有一個線程能獲得這個鎖去修改變量就保證了資料結果的正确性:

線程鎖Lock ,Rlock

 重入鎖使用和Lock 效果比較類似,差別在于原語鎖的鎖不屬于任何特定的線程,可以被任何線程釋放鎖,而重入鎖每次隻能屬于一個線程,由誰加鎖,就還是的誰來釋放,而且可以鎖嵌套,但是我要保證鎖的釋放,否則就會形成死鎖

線程鎖Lock ,Rlock