如果我创建地图
Map map=new HashMap(40,.75f);
按照两种不同的方式同步
Collections.synchronizedMap(map) :- which is internally using mutex
synchronized(map){}
上述两种方法之间有什么区别。
答案 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