'''
線程鎖
如果想保證共享數據的安全性,則需要添加Lock。(只要加鎖則運算的速度就會變慢)
步驟:
from threading import Lock
1. lock = Lock() 創建鎖對象
2. 獲取鎖:
lock.acquire() 默認是阻塞,可以設置阻塞超時時間 timeout=秒
釋放鎖:
lock.release()
總結: 哪段代碼操作共享數據,則對其加鎖
'''
import threading
number = 0
def task1():
global number
# 開始加鎖
lock.acquire() # 獲取
for i in range(300000):
number += 1
# 釋放鎖
lock.release() # 釋放
print('{}的number值是:{}'.format(threading.current_thread().name, number))
def task2():
global number
# 開始加鎖
lock.acquire() # 獲取
for i in range(300000):
number += 1
# 釋放鎖
lock.release() # 釋放
print('{}的number值是:{}'.format(threading.current_thread().name, number))
if __name__ == '__main__':
lock = threading.Lock()
t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)
t1.start()
t2.start()
t1.join()
t2.join()
print('最後獲取number 的值是:', number)
import threading
from threading import Lock
from time import sleep
def task1():
lock.acquire()
print('{}拿到鎖了...'.format(threading.current_thread().name))
sleep(10)
lock.release()
print('{}釋放鎖了...'.format(threading.current_thread().name))
def task2():
lock.acquire(timeout=5) # 線程2獲取鎖,如果鎖被佔用則當前線程就會阻塞等待
print('{}拿到鎖了...'.format(threading.current_thread().name))
sleep(10)
try:
lock.release()
except:
print('沒有拿到鎖,是超時進入代碼執行的...')
else:
print('{}釋放鎖了...'.format(threading.current_thread().name))
if __name__ == '__main__':
lock = Lock()
t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)
t1.start()
t2.start()