如果我创建地图

Map map=new HashMap(40,.75f);


通过以下两种不同方式进行同步

Collections.synchronizedMap(map) :- which is internally using mutex
synchronized(map){}


上面两种方法有什么区别。

最佳答案

Collections.synchronizedMap(map) :- which is internally using mutex
synchronized(map){}



  上面两种方法有什么区别。


区别在于Collections.synchronizedMap(map)通过将地图包装在同步对象中为您进行同步。如果查看Collections类的Java源代码,则应该看到SynchronizedMap对象。在那里,它的工作类似于:

final Object      mutex;        // Object on which to synchronize
...
public int size() {
   synchronized (mutex) {return m.size();}
}


因此,在内部它的作用与在外部调用synchronized的作用相同。但是,这需要您手动进行猜测工作和编程。它可以使您避免丢失和保护重要的方法调用,或者将您的Map传递给没有正确同步它或其他东西的库。

第三种选择可能更好,那就是使用ConcurrentHashMap。这是一个从头开始编写的哈希映射,以允许多个线程对其并行操作。它将提供比您提到的两个选项更好的性能。

09-27 23:03