Java concurrenthashmap中的可重入锁定是否使用它';s可选&x201C;公平”;参数

Java concurrenthashmap中的可重入锁定是否使用它';s可选&x201C;公平”;参数,java,synchronization,concurrenthashmap,Java,Synchronization,Concurrenthashmap,在ConcurrentHashMap中,我们有一些段基本上扩展了ReentrantLock static final class Segment<K,V> extends ReentrantLock implements Serializable 假设线程t1在ConcurrentHashMap的一个分区上有读锁,另外两个线程t2和t3分别在同一分区上等待读锁和写锁。那么,一旦t1释放了锁,哪一个(t2或t3)将获得锁呢 据我所知,如果公平是真的,那么等待时间最长的人就是这个人。但

在ConcurrentHashMap中,我们有一些段基本上扩展了ReentrantLock

static final class Segment<K,V> extends ReentrantLock implements Serializable
假设线程t1在ConcurrentHashMap的一个分区上有读锁,另外两个线程t2和t3分别在同一分区上等待读锁和写锁。那么,一旦t1释放了锁,哪一个(t2或t3)将获得锁呢


据我所知,如果公平是真的,那么等待时间最长的人就是这个人。但是在concurrentHashMap的情况下设置为true吗?如果没有,我们能否确定哪个线程将获得下一个锁?

从ConcurrentHashMap源代码中,我们可以看到它使用了ReentrantLock的子类

static final class Segment<K,V> extends ReentrantLock
   ...
   Segment(float lf, int threshold, HashEntry<K,V>[] tab) {
            this.loadFactor = lf;
            this.threshold = threshold;
            this.table = tab;
   }
   ...
静态最终类段扩展了ReentrantLock
...
段(浮点lf、整数阈值、HashEntry[]选项卡){
这个。载荷系数=lf;
这个阈值=阈值;
this.table=tab;
}
...

正如我们所看到的,它唯一的构造函数隐式调用了ReentrantLock的no args构造函数,该构造函数创建了一个非公平锁。这意味着ConcurrentHashMap的锁总是不公平的

据我所知,ConcurrentHashMap不会在读取时锁定。是的,它不会锁定,除了少数小情况。我的观点是这不会导致不正确的数据吗?假设我们执行putAll()操作,然后执行read操作。putAll()的所有更改是否会反映在另一个线程的后续读取中?因此,我们是否可以断言下一个线程将获取锁?没有。但是,如果我们选择适当的并发级别,根据文档,并发更新之间应该没有争用
static final class Segment<K,V> extends ReentrantLock
   ...
   Segment(float lf, int threshold, HashEntry<K,V>[] tab) {
            this.loadFactor = lf;
            this.threshold = threshold;
            this.table = tab;
   }
   ...