經典例子:老婆(朱麗葉)老公(羅密歐),使用銀行卡和存折,或者網銀等,同時對同一賬戶操作的安全問題。
此處用多線程實作,同時取款的模拟實作,使用同步代碼塊確定線程同步,檢視取款安全隐患問題,代碼如下:
--------------------------------------------------------------------------------------------------------------------------------------
* 線程同步 :使用同步塊,實作線程同步
* 同步synchronized塊的對象監視鎖可為為: 任意的對象(此處為'account'對象)。
* (runnable适用于共享同一對象(如:this),如果thread繼承就會有問題[保證thread繼承下安全:1.鎖使用涉及目前對象外的對象(例如:syncblock、bankaccount對象外的其他類對象;2.鎖使用靜态目前類對象)])
* 多個線程使用同一把鎖,如果線程安全必需確定:多個線程使用的是同一個對象監視鎖對象
* synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上内置鎖,進而實作同步
* 所有通路此同步代碼塊的線程都在同步塊外等待,都會判斷同步鎖,降低效率,但確定線程安全問題,外,同步代碼塊外代碼正常執行
* 同步方法優于同步代碼塊:性能和memory空間上。
* 同步是一種高開銷的操作,是以應該盡量減少同步的内容。通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可
private void makewithdraw(int amount){
/*.........同步代碼塊外代碼.............*/
synchronized (account) {
//同步代碼
}
}
銀行賬戶:
同步代碼塊代碼:
測試代碼:
測試結果:
分析結果:
雙線程總共取款10次,賬戶總額為500.
取款結果:在多線程通路下,成功取款總額為500,并且其他取款下,正确提示資訊。
多線程通路安全保證!