from threading importthread, 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 importthread, 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 importthread, 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 ...