2
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()这是否意味着线程 B 在执行该方法时不会阻塞clear()

上面的代码和有这个有什么区别?

    public void clear() {
        synchronized (map) {
            map.clear();
        }
    }
4

3 回答 3

5

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

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

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

于 2013-01-10T21:29:21.490 回答
1

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

于 2013-01-10T21:29:17.357 回答
0

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

于 2013-01-10T21:30:00.567 回答