当我执行Collections.synchronizedMap(someHashMap)时,对该映射的所有访问都同步了吗?还是只同步写入操作(put)?如果有两个线程正在从Map中读取呢?它会同步吗?似乎没有必要如果一个线程在执行put(),而另一个线程正在执行get(),情况如何?
查看包装Map
的SynchronizedMap
的源代码。
...
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
来自
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<>(m);
}
所以,是的,所有访问都是同步的。
是的,它同步所有操作。它不使用多读取器、单写入器的方法——它就像通过单个监视器同步所有访问一样简单。
读取和写入都是同步的,这对于确保可见性是必要的。
集合上的所有方法调用都是同步的。一次只允许一个线程读取/修改集合。
Collections中的synchronized*方法并非设计为最佳线程安全版本/实现。他们只是被认为是方便的。
同步是一个难题,通常需要根据您的具体情况采用不同的同步方法。如果您需要其他类型的线程安全,那么还有很多其他线程安全集合可用。您也可以自己编写同步逻辑。