如果可能,我想避免鎖定讀取。但是,即使沒有涉及部分初始化的成員,這種「感覺」就像是雙重檢查鎖定。這是一個哈希映射線程安全的對象的懶惰初始化模式?
這是一個很好的構造嗎?
private final Map<String, Stuff> stash = new HashMap<String, Stuff>();
public Stuff getStuff(String name) {
if (stash.containsKey(name))
return stash.get(name);
synchronized(stash) {
if (stash.containsKey(name)) {
return stash.get(name);
}
else {
Stuff stuff = StuffFactory.create(name);
stash.put(name, stuff);
return stuff;
}
}
}
你應該使用類似番石榴的[地圖製作工具(http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/MapMaker.html),除非這是爲了好玩。 –