当我执行Collections.synchronizedMap(someHashMap)时,是否所有对地图的访问都是同步的?或者只写同步操作(put)? 如果两个线程正在从Map中读取怎么样?会同步吗?似乎有必要 如果一个线程正在执行put()而另一个执行get()?
,abotu如何abotu答案 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 *方法并不是最好的线程安全版本/实现。他们只是想方便。
同步是一个难题,通常需要根据您的具体方案采用不同的同步方法。如果您需要其他类型的线程安全性,则可以使用许多其他线程安全集合。您也可以自己编写同步逻辑。