看板 java 關於我們 聯絡資訊
※ 引述《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
H45:只 synchronize 正要產生的物件應該就可以了吧? 09/29 11:40
H45:....啊,原來你就是這樣寫的 =.= 09/29 11:45