2

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

4

4 回答 4

4

查看SynchronizedMap包装您的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

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
    return new SynchronizedMap<>(m);
}

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

于 2013-08-14T20:18:00.087 回答
1

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

于 2013-08-14T20:18:01.640 回答
0

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

于 2013-08-14T20:18:19.853 回答
0

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

Collections 中的 synchronized* 方法并非设计为最好的线程安全版本/实现。他们只是假设方便。

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

于 2013-08-14T20:19:07.840 回答