看板 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 Obj getObj(Key key) { // 絕對不會return null : synchronized(?) { // 想只對相同 key 作sync : if (!this.map.containsKey(key)) { : Obj obj = generateObj(); // generateObj 會很花時間, 只想作一次 : this.map.set(key, obj); : } : } : return this.map.get(key); : } : } : 我該怎樣 synchroized (?), 除了使用 synchronized(this). : 以上的技巧有幫助嗎, 或是有更聰明的方法? : 感謝! 我會寫成下面這樣說 @@ public Obj getObj(Key key) { synchronized (map) { if( map.containsKey(key) ) return map.get(key); Obj obj = generateObj(); map.set(key, obj); return obj; } } generateObj() 期間應該還是要鎖住 map 吧 主要是因為obj真正放入map前, 都要保證不會有別人去用它 不然就算先放了一個假的,再來慢慢產生obj, 在obj還沒有建立好前, 沒把map鎖住, 要是有別人去get它, 應該會囧掉吧? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.105.166
easy1:不知道synchronized(map) 是不是就同時讓map無法被其它 09/28 23:33
easy1:Thread put 和 get, (尤其是同時有很多不同的key) 09/28 23:35
AI3767:嗯, 我剛測試後, map還是會被用orz, 原來我之前都搞錯了>< 09/29 00:40
H45:沒錯,所謂的鎖住 map, 只是讓其他也要鎖住 map 的執行緒等待 09/29 00:44