3

在 ConcurrentHashMap 中,我们有基本上扩展 ReentrantLock 的段。

static final class Segment<K,V> extends ReentrantLock implements Serializable

这个 ReentrantLock 是否使用它的公平属性?

public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}

因此,假设线程 t1 在 ConcurrentHashMap 的一个分区上具有读锁,另外两个线程 t2 和 t3 分别在同一分区上等待读锁和写锁。所以一旦 t1 释放它的锁,哪个(t2 或 t3)将获得锁。

据我所知,如果将公平设置为真,那将是等待时间最长的人。但是在concurrentHashMap的情况下是否设置为true?如果不是,我们可以肯定地说哪个线程将获得下一个锁?

4

1 回答 1

5

从 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 的无参数构造函数,该构造函数创建了一个非公平锁。这意味着 ConcurrentHashMap 的锁总是不公平的

于 2013-07-09T05:20:22.080 回答