只有在一个地方使用对象时会出现同步阻塞会发生什么?

时间:2013-01-10 21:24:47

标签: java

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();
        }
    }

3 个答案:

答案 0 :(得分:5)

你的怀疑是正确的;这段代码有一个错误。

你也需要锁定clear();除此以外;您仍然可以同时运行put()clear()

但是,您实际上应该使用ConcurrentHashMap()代替。

答案 1 :(得分:1)

正确。为什么会这样?这是synchronized块的重点 - 线程B没有执行synchronized块。在这种情况下,它就像没有同步一样。

答案 2 :(得分:0)

对于应控制对给定资源的访问的每个位置,您应该进行同步。您的第一个示例只有在遇到同步块(它不在clear()中)时才会以同步方式运行,否则它将继续正常运行。您在第二个示例中锁定clear()将导致线程B检查。