作者adrianshum (Alien)
看板java
标题Re: [问题] synchronized 动态产生的 object ?
时间Sat Sep 29 09:35:28 2007
※ 引述《adrianshum (Alien)》之铭言:
: 标题: Re: [问题] synchronized 动态产生的 object ?
: 时间: Fri Sep 28 20:20:13 2007
:
:
: 我会建议:
:
: public void doObj(Key key) {
: synchronized {
: if (this.map.containsKey(key)) {
: return;
: }
: this.map.put(key, null);
: }
:
: // 慢慢 generate 你的 obj
: Obj obj = genObject();
: this.map.put(key, obj);
: }
:
: Alien
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 202.22.246.26
: 推 easy1:sorry: :-p 刚刚改了原文章 问题不太一样了 09/28 20:36
之前你的重点是因为不想 obj generation 的耗时影响其他人,是吧?
但如果现在的话,你希望後来者是等待至 generate 完就 return?
不然就用下面的奸招吧?
(psuedo code)
class Holder {
Object syncObj = new Object();
Obj value = null;
}
public Obj getObj(Key key) {
Holder valueHolder = null;
synchronized (map) {
if (map.contains(key)) {
valueHolder = map.get(key);
if (valueHolder.value != null) {
return valueHolder.value;
}
} else {
valueHolder = new Holder();
map.put(key, valueHolder);
}
}// end sync(map)
// 来到这里的话,该是有一个 key + empty Holder 在 map 里
synchronized(valueHolder.syncObj) {
if (valueHolder.value == null) { // double check
valueHolder.value = generateObject(); //慢慢的 generate
}
return valueHolder.value;
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.77.26.195
1F:推 H45:只 synchronize 正要产生的物件应该就可以了吧? 09/29 11:40
2F:推 H45:....啊,原来你就是这样写的 =.= 09/29 11:45