2012-08-16 142 views
0

我試圖爲BankAccount轉賬的經典問題編寫同步代碼。現在我正試圖找出解決方案的問題。在網絡上找到的任何解決方案中,傳輸方法使用了兩個鎖,但我沒有使用任何鎖。java同步銀行賬戶轉賬

class BankAccount 
    { 
     double balance; 

     public void synchronized deposit(double amount) 
     { 
      balance+=amount; 
     } 

     public void synchronized withdraw(double amount) 
     { 
     balance-=amount; 
     } 

     public void transferTo(BankAccount b, double amount) 
     { 
      this.withdraw(amount); 
      b.deposit(amount); 

     } 
    } 

請告訴我可能是transferTo()的問題。請原諒,請注意balance的限制檢查。我實際上擔心是否不將原子轉移到原子會導致問題(死鎖)。這種情況的一個例子會很好。

+0

那麼一個錯誤是在那裏的單詞'雙'。 – Antimony 2012-08-16 04:57:14

+0

爲什麼會出現雙重問題? – 2012-08-16 05:15:45

+0

如果你沒有得出結果,你可以得到一個舍入誤差,有些人認爲這是不可接受的。使用'長'美分或'BigDecimal'是一個很好的選擇。我發現在大多數情況下,結果是四捨五入的。 – 2012-08-16 05:18:56

回答

1

除了採用雙層,我看不出有任何特別的問題,但你必須記住的transferTo不是原子以後可能會導致問題。但是,您實際上正在使用鎖。每個同步方法隱式使用一個鎖。

0

您儘快使用鎖你把​​塊到位。在這種情況下,鎖將通過正在修改的類對象獲取,這就是您的代碼工作正常的原因。

但是你transferTo方法可能並不像這裏面的操作都正常工作是同步的,但不是整個交易。

希望這有助於!

+0

我實際上試圖找出一種情況,其中不使transferTo方法原子化會導致問題。 – 2012-08-16 05:14:29

+0

@user從概念上講,這不是問題,因爲在reallife中,這種交易不是原子的。如果你的用戶期望它是原子的,這只是一個問題。另外,它實際上鎖定了實例,而不是類對象(我認爲Bharat錯過了) – Antimony 2012-08-16 06:23:31