天天看點

銀行取款[多線程]{使用同步代碼塊確定線程同步}

經典例子:老婆(朱麗葉)老公(羅密歐),使用銀行卡和存折,或者網銀等,同時對同一賬戶操作的安全問題。

此處用多線程實作,同時取款的模拟實作,使用同步代碼塊確定線程同步,檢視取款安全隐患問題,代碼如下:

--------------------------------------------------------------------------------------------------------------------------------------

 * 線程同步 :使用同步塊,實作線程同步

 * 同步synchronized塊的對象監視鎖可為為: 任意的對象(此處為'account'對象)。

 * (runnable适用于共享同一對象(如:this),如果thread繼承就會有問題[保證thread繼承下安全:1.鎖使用涉及目前對象外的對象(例如:syncblock、bankaccount對象外的其他類對象;2.鎖使用靜态目前類對象)])

 * 多個線程使用同一把鎖,如果線程安全必需確定:多個線程使用的是同一個對象監視鎖對象

 * synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上内置鎖,進而實作同步

 * 所有通路此同步代碼塊的線程都在同步塊外等待,都會判斷同步鎖,降低效率,但確定線程安全問題,外,同步代碼塊外代碼正常執行

 * 同步方法優于同步代碼塊:性能和memory空間上。

 * 同步是一種高開銷的操作,是以應該盡量減少同步的内容。通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可

 private void makewithdraw(int amount){

  /*.........同步代碼塊外代碼.............*/

  synchronized (account) {

   //同步代碼

  }

 }

銀行賬戶:

同步代碼塊代碼:

測試代碼:

測試結果:

分析結果:

雙線程總共取款10次,賬戶總額為500.

取款結果:在多線程通路下,成功取款總額為500,并且其他取款下,正确提示資訊。

多線程通路安全保證!

繼續閱讀