Class A {
private Map<Oject,Object> map;
public void clear() {
map.clear();
}
public void work() {
synchronized (map) {
map.put(new Object, new Object();
}
}
}
如果线程A在work()
方法的中间,这是否意味着如果执行clear()
方法,线程B将不会阻塞?
上面的代码与此之间有什么区别?
public void clear() {
synchronized (map) {
map.clear();
}
}
答案 0 :(得分:5)
你的怀疑是正确的;这段代码有一个错误。
你也需要锁定clear()
;除此以外;您仍然可以同时运行put()
和clear()
。
但是,您实际上应该使用ConcurrentHashMap()
代替。
答案 1 :(得分:1)
正确。为什么会这样?这是synchronized
块的重点 - 线程B没有执行synchronized
块。在这种情况下,它就像没有同步一样。
答案 2 :(得分:0)
对于应控制对给定资源的访问的每个位置,您应该进行同步。您的第一个示例只有在遇到同步块(它不在clear()
中)时才会以同步方式运行,否则它将继续正常运行。您在第二个示例中锁定clear()
将导致线程B检查。