Re: [問題] synchronized 動態產生的 object ?

看板java作者 (Alien)時間18年前 (2007/09/29 09:35), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串5/6 (看更多)
※ 引述《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
只 synchronize 正要產生的物件應該就可以了吧?
09/29 11:40, 1F

09/29 11:45, , 2F
....啊,原來你就是這樣寫的 =.=
09/29 11:45, 2F
文章代碼(AID): #16_QlXTS (java)
討論串 (同標題文章)
文章代碼(AID): #16_QlXTS (java)