作者AI3767 (AI3767)
看板java
标题Re: [问题] synchronized 动态产生的 object ?
时间Fri Sep 28 23:31:01 2007
※ 引述《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
1F:推 easy1:不知道synchronized(map) 是不是就同时让map无法被其它 09/28 23:33
2F:→ easy1:Thread put 和 get, (尤其是同时有很多不同的key) 09/28 23:35
3F:推 AI3767:嗯, 我刚测试後, map还是会被用orz, 原来我之前都搞错了>< 09/29 00:40
4F:推 H45:没错,所谓的锁住 map, 只是让其他也要锁住 map 的执行绪等待 09/29 00:44