ConcurrentHashMap和Hashtable中使用的锁机制

3

这个问题最近在Java面试中问到了我。 后来我试着去搜索答案,但是没有找到确切的答案。 如果有人有答案的链接,请告诉我一下。 那么这就是我的问题:

ConcurrentHashMap和Hashtable都是同步的。 但是在写操作时它使用哪种锁机制来进行锁定?


1
这些类的Javadoc类注释中有解释。 - wero
希望这可以帮到你:ConcurrentHashMap和Hashtable - Rahman
3个回答

3
开源的好处在于你可以查看源代码这里尤其相关。
ConcurrentHashMap中的并发性非常复杂-它将内容分解为Segment来避免锁定整个表,并使用volatile字段允许无锁并发读取。

1
ConcurrentHashMap内部使用分段锁技术,将桶划分为多个段,每个段可以被一个线程锁定以进行写操作。
Segment是一个静态类,它是哈希表的专用版本,并实现了Reentrantlock以简化锁定。
static class Segment<K,V> extends ReentrantLock implements Serializable {
        private static final long serialVersionUID = 2249069246763182397L;
        final float loadFactor;
        Segment(float lf) { this.loadFactor = lf; }
}

Segments的构造函数调用ReentrantLock的无参构造函数,并创建一个非公平锁。


0

ConcurrentHashMap 的两个主要特征是:

  • 在写入 ConcurrentHashMap 时,只锁定地图的一部分
  • 读取通常可以无需锁定。

可能有两个并行线程同时写入 ConcurrentHashMap。根据 ConcurrentHashMap 的默认实现,最多可以并行写入和读取 16 个线程。但最坏情况是,如果两个对象位于 ConcurrentHashMap 的同一段或分区中,则无法进行并行写入。


1
但是在内部锁定段时,使用哪种锁定技术? - sussie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接