假設這是一個「單例」實現:我保證這隻會調用一次productCatalogLoader.load(),並且不會出現任何空指針?任何方法來使這更簡單?使用沒有鎖定的writeLock安全嗎?
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private ProductCatalog productCatalog;
public ProductCatalog get() {
if (this.productCatalog == null) {
reload();
}
return this.productCatalog;
}
public void reload() {
lock.writeLock().lock();
try {
if (this.productCatalog != null) return;
this.productCatalog = productCatalogLoader.load();
} finally {
lock.writeLock().unlock();
}
}
}
編輯: 這是一個謙虛成功的嘗試減少更爲複雜的代碼,以一個簡單的問題樣本。有幾個人注意到我的單例過於複雜的事實;)(實際上也有一個石英計時器調用reload,但是「重新加載」實現與IRL有點不同)。無論如何,我得到了我所需要的答案,破壞了雙重鎖定。
關鍵詞是「不安全的出版物」。 – 2009-04-22 12:32:32