Re: [問題] synchronized 動態產生的 object ?
※ 引述《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
推
09/29 11:40, , 1F
09/29 11:40, 1F
推
09/29 11:45, , 2F
09/29 11:45, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 6 篇):