Collections中的synchronizedMap方法是否同步读取和写入操作

时间:2013-08-14 20:14:20

标签: java collections map synchronized java-5

当我执行Collections.synchronizedMap(someHashMap)时,是否所有对地图的访问都是同步的?或者只写同步操作(put)? 如果两个线程正在从Map中读取怎么样?会同步吗?似乎有必要 如果一个线程正在执行put()而另一个执行get()?

,abotu如何abotu

4 个答案:

答案 0 :(得分:4)

查看包含SynchronizedMap的{​​{1}}源代码。

Map

...
public V get(Object key) {
    synchronized (mutex) {return m.get(key);}
}

public V put(K key, V value) {
    synchronized (mutex) {return m.put(key, value);}
}
public V remove(Object key) {
    synchronized (mutex) {return m.remove(key);}
}
... // more methods synchronized in the same way

所以,是的,所有访问都是同步的。

答案 1 :(得分:1)

是的,它会同步所有操作。它不使用多读者,单写入器方法 - 它就像通过单个监视器同步所有访问一样简单。

答案 2 :(得分:0)

读取和写入都是同步的,这是确保可见性所必需的。

答案 3 :(得分:0)

对集合的所有方法调用都是同步的。一次只允许一个线程读取/修改集合。

Collections中的synchronized *方法并不是最好的线程安全版本/实现。他们只是想方便。

同步是一个难题,通常需要根据您的具体方案采用不同的同步方法。如果您需要其他类型的线程安全性,则可以使用许多其他线程安全集合。您也可以自己编写同步逻辑。