通过调用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不适合这里吗?
答案 0 :(得分:4)
我认为这是出于历史原因而做的最重要的事情:如果仔细观察,在JDK 1.5版中添加了ReadWriteLock,而1.2版以来,SynchronizedMap是JDK的一部分。
如果我们从行为兼容性的角度考虑,突然改变同步地图内部工作方式(即通过命令两者读取和写入)是无效的,因为会有很多程序写在1.2和1.5之间,这将完全依赖于这种行为。另一点是 - 地图实现被称为 synchronized ,这实际上意味着它命令每次访问,就像synchronized
关键字一样。
还有更多:读写锁有两种同步:公平和非公平。如果我们用读写锁替换简单的互斥锁,我们会选择哪种风格?不同的锁实现怎么样?等
诚然,提供与ConcurrentHashMap一样的通用并发映射更有意义,如果开发人员需要,其他所有内容都将由库编写者实现。