【发布时间】:2015-08-30 18:56:12
【问题描述】:
我在一个 HashMap 上使用来自多个线程的 .get(...)、.put(...) 和 .clear() 操作。 .put(...) 和 .clear() 在 synchronized 块内,但 .get(...) 不在。我无法想象这会导致问题,但在我看到的其他代码中.get() 几乎总是同步的。
get/put相关代码
Object value = map.get(key);
if(value == null) {
synchronized (map) {
value = map.get(key); // check again, might have been changed in between
if(value == null) {
map.put(key, new Value(...));
}
}
}
清晰就是:
synchronized (map) {
map.clear();
}
由于同步,写入操作将使缓存无效,get(...) 返回 null 或实例。通过将.get(...) 操作放入synchronized(map) 块中,我真的看不出会出现什么问题或有什么改进。
【问题讨论】:
-
这就是创建 java.util.concurrent.locks.ReadWriteLock 的原因。
标签: java multithreading synchronization