# 多線程操做共享數據---------------------------------------------------------------多線程
# import threading
# 使用鎖
# 獲取鎖對象,全局惟一的
# lock = threading.Lock()ui
# 加鎖(獲取鎖) 未獲取到的線程會阻塞程序,知道獲取到鎖纔會往下執行
# lock.acquire()線程
# 釋放鎖 歸還鎖,其餘線程能夠拿去用了
# lock.release()對象
# 注意:加鎖和釋放鎖必須成對出現,不然就有可能形成死鎖資源
# 爲了不出現死鎖,推薦用以下上下文管理器在加鎖
# lock = threading.Lock()
# with lock: # with語句會在這個代碼塊執行前自動獲取鎖,在執行結束後自動釋放鎖
# 這裏寫本身的代碼
# passget
# 使用鎖的意義?
# 加鎖是爲了對鎖內資源進行鎖定,避免其餘線程篡改已被鎖定的資源同步
'''
線程同步:若是多個線程共同對某個數據進行修改,可能會出現不可預料的結果
爲了保證數據的正確性,須要多多個線程進行同步
使用Thread對象的Lock和Rlock能夠實現簡單的線程同步,這個兩個對象都有acquire方法和release方法
對於那些須要每次只容許一個線程操做的數據,能夠將其操做放到acquire和release方法之間。it
'''thread
import threading
import timeimport
num = 0
lock = threading.Lock()
def func(st):
global num
print(threading.currentThread().getName() + ' try to acquire the lock')
if lock.acquire():
print(threading.currentThread().getName() + ' acquire the lock.')
print(threading.currentThread().getName() + " :%s" % str(num))
num += 1
time.sleep(st)
print(threading.currentThread().getName() + ' release the lock.')
lock.release()
t1 = threading.Thread(target=func, args=(8,))t2 = threading.Thread(target=func, args=(4,))t3 = threading.Thread(target=func, args=(2,))t1.start()t2.start()t3.start()