为什么Java的SynchronizedMap使用单个互斥锁而不是ReadWrite锁?

时间:2017-04-09 12:31:35

标签: java multithreading dictionary locking synchronized

通过调用SynchronizedMap创建的Java Collections.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);}
}

...

为什么作者选择使用单个互斥锁进行读写操作? ReadWriteLock不适合这里吗?

1 个答案:

答案 0 :(得分:4)

我认为这是出于历史原因而做的最重要的事情:如果仔细观察,在JDK 1.5版中添加了ReadWriteLock,而1.2版以来,SynchronizedMap是JDK的一部分。

如果我们从行为兼容性的角度考虑,突然改变同步地图内部工作方式(即通过命令两者读取和写入)是无效的,因为会有很多程序写在1.2和1.5之间,这将完全依赖于这种行为。另一点是 - 地图实现被称为 synchronized ,这实际上意味着它命令每次访问,就像synchronized关键字一样。

还有更多:读写锁有两种同步:公平和非公平。如果我们用读写锁替换简单的互斥锁,我们会选择哪种风格?不同的锁实现怎么样?等

诚然,提供与ConcurrentHashMap一样的通用并发映射更有意义,如果开发人员需要,其他所有内容都将由库编写者实现。