Collections中的synchronizedMap方法是不是同步读写操作[重复]

Posted

技术标签:

【中文标题】Collections中的synchronizedMap方法是不是同步读写操作[重复]【英文标题】:Does the synchronizedMap method in Collections synchronize both read and write operations [duplicate]Collections中的synchronizedMap方法是否同步读写操作[重复] 【发布时间】:2013-08-16 23:26:03 【问题描述】:

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

【问题讨论】:

因为Collections.synchronizedMap 非常基础,几乎无法使用。 ConcurrentHashMap 用于更严重的并发使用。 【参考方案1】:

查看封装了MapSynchronizedMap 的源代码。

...
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);

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

【讨论】:

但不幸的是,读取和写入在内部互斥体上同步,这使得外部代码在持有锁的同时无法遍历整个数据。编辑:Sotirios 和 Affe 是正确的,我的评论应该被忽略。 javadoc 是这么说的:It is imperative that the user manually synchronize on the returned map when iterating over any of its collection views:... 互斥锁确实就是'this',它的写法简直是地道。同步地图以对其进行迭代可以正常工作。 代码之所以同步在mutex而不是直接在this是因为代码是与SynchronizedSortedMap共享的,需要支持返回一个在父地图上同步的subMap。见Collections.SynchronizedSortedMap.subMap @SotiriosDelimanolis 我知道,我只是说明为什么这些方法不写为public synchronized someMethod...。它不仅仅是惯用的,它是为了提供对返回 SynchronizedMap 的支持,该 SynchronizedMap 通过 SynchronizedMap 的第二个构造函数在父地图上同步。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于Collections中的synchronizedMap方法是不是同步读写操作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Synchronized vs Concurrent Collections(并发集合VS同步集合)

Synchronized vs Concurrent Collections(并发集合VS同步集合)

[JCIP笔记]JDK并发包

ARRAYLIST如何保证线程安全

ArrayList如何保证线程安全

高并发容器CopyOnWriteArrayList原理解析