Collections.synchronizedMap()和synchronized之间的区别

时间:2014-03-20 10:29:43

标签: java collections synchronized

如果我创建地图

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

按照两种不同的方式同步

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

上述两种方法之间有什么区别。

2 个答案:

答案 0 :(得分:1)

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可能有更好的第三个选项。这是一个从头开始编写的哈希映射,允许多个线程并行操作。它将提供比您提到的两个选项更好的性能。

答案 1 :(得分:0)

同步对象确保一次只有一个线程可以使用该对象。

http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html