'''
練習:線程鎖
threading 模塊提供了Lock和RLock兩個類
1、threading.Lock:它是基本的鎖對象,每次只能鎖定一次,其餘的鎖請求,需要等待鎖釋放後才能獲取。
2、threading.RLock:它代表可重入鎖,同一個線程中可以多次鎖定,也可以多次釋放。該鎖的acquire()和Release()方法必須成對出現
3、Lock和RLock都提供了兩個方法實現加鎖和釋放鎖
a、acquire(blocking=True,timeout=-1),請求加鎖,其中timeout制定加鎖多少秒
b、release():釋放鎖
'''
import threading
import time
class Account:
def __init__(self,account_no,balance):
#定義account構造函數
#封裝賬戶編號和賬戶餘額兩個成員變量
self.account_no = account_no
self._balance = balance
self.lock = threading.RLock()
def getBalance(self):
#由於賬戶餘額不允許隨便修改,所以只爲self._balance提供getter方法
return self.balance
def draw(self,draw_amount):
#提供一個線程安全的draw()方法來完成取錢操作
#加鎖
self.lock.acquire()
try:
if self._balance >= draw_amount:
print(threading.current_thread().name+"取錢成功!吐出鈔票:"+str(draw_amount))
time.sleep(0.001)
#修改餘額
self._balance -=draw_amount
print("\t餘額爲:"+str(self._balance))
else:
print(threading.current_thread().name+"取錢失敗,餘額不足!")
finally:
self.lock.release()
def draw_money(account,draw_amount):
#傳遞進來的account對象和需要取的錢數-draw_amount
account.draw(draw_amount)
acct = Account("134567",1000)
#使用兩個線程模擬取錢
threading.Thread(name='甲', target=draw_money, args=(acct, 800)).start()
threading.Thread(name='乙', target=draw_money, args=(acct, 800)).start()
'''執行結果如下
甲取錢成功!吐出鈔票:800
餘額爲:200
乙餘額不足,取錢失敗!
'''