我讀過所有關於雙重檢查鎖定修復程序如何工作的內容,我不喜歡延遲初始化,但能夠修復遺留代碼並且這樣的問題太誘人而不嘗試解決。我的例子: private int timesSafelyGotten = 0; private Helper helper = null;Java通過強制同步兩次檢查加鎖,可行嗎?
public getHelper()
{
if (timesSafelyGotten < 1) {
synchronized (this) {
if (helper == null) {
helper = new Helper();
} else {
timesSafelyGotten++;
}
}
}
return helper;
}
這樣,同步代碼必須運行一次創建幫助,一旦當它得到首次所以理論上timesSafelyGotten不能遞增,直到它創造的助手同步碼後已經釋放鎖定和助手必須完成初始化。
我沒有看到任何問題,但它是如此簡單,似乎太好,不真實,你怎麼看?
迦勒詹姆斯·迪萊爾
如果您閱讀(並瞭解)爲什麼雙重檢查鎖定被破壞的詳細解釋之一,您將明白爲什麼您的代碼也被破壞。 – 2009-12-10 05:33:34
它也值得注意的是,隨着Java 5和易失性,你可以做不間斷的雙重檢查鎖定。 Java 4和更早的你的聲明確實如此。 – 2009-12-10 05:40:36
還值得注意的是,使用J5並大大提高了無爭用鎖的性能,DCL幾乎總是過早的優化,不值得冒這個風險。 – 2009-12-10 06:16:53