2012-09-26 48 views
-1

你好,我正在嘗試使用雙重對象,而不是類型爲了同步線程。這是一項家庭作業。元素沒有附加源代碼Java.Lang

概述:此應用程序是銀行系統的一個簡單示例,它具有作爲存儲程序運行的線程和作爲提取程序運行的線程。存款人增加10美元,提款人刪除10美元,因此申請結束時應該有10個不變的銀行賬戶。

在每個類(存款人和提款人)中,我能夠使用帳戶對象上的塊同步來實現目標。所以我作業的作業部分已經完成了,我不需要幫助。

我想到了,我覺得鎖定整個帳戶對象是矯枉過正。由於交易中唯一真正關鍵的部分是變更變量

balance 

最初的可變餘額是雙倍。我的目標是將變量更改爲Double對象,然後將同步塊移到帳戶對象的內部,並且僅在修改平衡變量的代碼部分周圍。

當我改變了代碼,雙,沒有錯誤,但我得到一張紙條:

This element has no attached source and the Javadoc could not be found in the attached Javadoc 

此外,代碼不工作作爲自己的價值觀來表達錯了底。

問題:

  1. 是我的理論是正確的,我應該能夠鎖定僅平衡變量?
  2. 我該如何讓我的代碼識別Double.Java.lang代碼?

感謝

下面是一些代碼...

聲明:

private Double balance; 

構造:

this.balance = new Double(balance); 

鎖定:

synchronized(balance){ 

balance = balance + amount; 

} 
+4

向我們展示一些代碼。 –

+0

在第二個問題中應該有「java.lang」而不是「Java.lang」(包名中我們只使用小寫字母)。 – Pshemo

+0

確實有時,鎖定整個對象是過度殺傷力,對性能不利。但另一方面,將呼叫鎖定在關鍵資源上有時還不夠。一些行爲必須「原子地」完成,因此必須作爲一個塊被鎖定。通常情況下,「讀寫改變」塊就是這個選擇。在您更改了資源並且尚未寫回資源之後,您不會希望另一個線程更改資源。 – Fildor

回答

1

我的理論是否正確,我應該只能鎖定平衡變量?

synchronized(balance) { 
    balance = balance + amount; 
} 

當你鎖定balance,你真的鎖定Double實例是balance價值,而不是在balance變量。但是你取代balance的值與不同的Double實例。如果有其他線程出現,它可能會看到新的Double並在當前線程釋放鎖(它仍然)保留在舊的Double上之前獲取該鎖。換句話說,你沒有得到適當的相互排斥。此外,「先發生之前」關係的先決條件未得到滿足,因此線程可能會看到共享變量和對象的版本不一致。

如果要鎖定實例變量,則需要鎖定它是實例的對象。


我怎樣才能讓我的代碼來識別雙倍的java.lang中的代碼?

這是一個IDE問題。 IDE無法找到與IDE配置爲使用的「rt.jar」文件相對應的源JAR文件。這很可能是因爲你必須讓IDE在JRE中使用「rt.jar」文件。解決方案是重新配置IDE以使用與JRE對應的JDK。

請注意,這不會改變程序的工作方式。只有當您單步進入核心類時,它纔會影響IDE向您顯示源代碼的能力。

相關問題