執行緒鎖Lock

2021-08-30 02:50:37 字數 1275 閱讀 5454

from threading import

thread, lock

import

time

deffunc():

global

n n -= 1n = 10t_list =

for i in range(10):

t = thread(target=func,)

t.start()

for t in

t_list:

t.join()

print(n)

這段**結果我們知道,因為gil的原因,結果是0

再看如下**:

from threading import

thread, lock

import

time

deffunc():

global

n temp =n

time.sleep(0.1)

n = temp - 1n = 10t_list =

for i in range(10):

t = thread(target=func,)

t.start()

for t in

t_list:

t.join()

print(n)

列印結果卻是9

為什麼呢?

因為在0.1秒之內,所有執行緒肯定都進來了,但是需要睡0.1秒,這就是阻塞狀態,他們會把手裡的資料讓給其他執行緒,所以每個執行緒的temp都是10,阻塞結束,10減1全變成9都寫入記憶體,最終n的值就是9了,這樣就導致資料的不安全了。

怎麼改進?加鎖就可以了

from threading import

thread, lock

import

time

deffunc(lock):

lock.acquire()

global

n temp =n

time.sleep(0.1)

n = temp - 1lock.release()

lock =lock()

n = 10t_list =

for i in range(10):

t = thread(target=func, args=(lock,))

t.start()

for t in

t_list:

t.join()

print(n)

這樣列印的結果就是0了。

lock執行緒鎖

lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。lock鎖可以顯示的獲取鎖物件和釋放鎖,而synchorized則是隱式的。不使用塊結構鎖就失去了使用 synchronized 方法和語句時會出現的鎖自動釋放功能。lock 介面的實現允許鎖在不同的作用範圍內...

python 多執行緒 鎖Lock

在上次講gil鎖的時候 位址 有講到gil鎖也會有釋放的時候,就會導致資料的錯誤讀訪問,10萬次左右可能不會有影響,然而量級大上去,結果就不再是零了。那麼如何解決這種問題呢?這裡引入lock from threading import lock a 0 lock lock def add fun g...

多執行緒程式設計(七)鎖Lock

測試 public class reentrantlocktest for int i 0 i 10 i finally 測試結果 加鎖次數0 加鎖次數1 加鎖次數2 加鎖次數3 加鎖次數4 加鎖次數5 加鎖次數6 加鎖次數7 加鎖次數8 加鎖次數9 解鎖次數0 解鎖次數1 解鎖次數2 解鎖次數3 ...