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

Why does Java's SynchronizedMap use a single mutex and not a ReadWrite lock?

Java 的 SynchronizedMap, which is created by calling 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 放在这里不是更合适吗?

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

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

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

老实说,像 ConcurrentHashMap 那样提供通用的并发映射更有意义,如果开发人员需要,其他一切都将由库编写者实现。