看板 java 關於我們 聯絡資訊
※ 引述《easy1 (e :) y)》之銘言: : http://java.sun.com/docs/books/tutorial/essential/concurrency/locksync.html : 中間有一個範例 : public class MsLunch { : private long c1 = 0; : private long c2 = 0; : private Object lock1 = new Object(); : private Object lock2 = new Object(); : public void inc1() { : synchronized(lock1) { c1++; } : } : public void inc2() { : synchronized(lock2) { c2++; } : } : } : 如果我的class是 : public class MyClass { : private HashMap <Key,Obj> map = new HashMap<Key, Obj>(); : public void doObj(Key key) { : synchronized(?) { // 想只對相同 key 作sync : if (!this.map.containsKey(key)) { : Obj obj = generateObj(); // generateObj 會很花時間 : this.map.set(key, obj); : } : } : } : } : 我該怎樣 synchroized (?), 除了使用 synchronized(this). : 以上的技巧有幫助嗎, 或是有更聰明的方法? : 感謝! 我會建議: 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