跳到主要内容

Java8开始ConcurrentHashMap,为什么舍弃分段锁?

参考答案:

ConcurrentHashMap 在 Java 8 中的设计变革主要是为了响应多核处理器和并发编程模型的发展。在 Java 8 之前,ConcurrentHashMap 使用了分段锁(Segmentation)的设计,每个段(Segment)都维护了一组哈希桶(Hash Bucket),并且每个段都有自己的锁。这种设计在一定程度上减少了锁竞争,但在高并发场景下,仍然可能存在热点锁的问题。

在 Java 8 中,ConcurrentHashMap 进行了重大改进,采用了全新的设计,主要基于以下几个原因:

  1. 减少锁竞争:分段锁虽然在一定程度上减少了锁竞争,但在高并发场景下,如果多个线程频繁访问同一个段,仍然会导致锁竞争。Java 8 中的 ConcurrentHashMap 采用了更细粒度的锁,即每个哈希桶都有自己的锁(Node 的锁),从而进一步减少了锁竞争。
  2. 更好的利用多核处理器:随着多核处理器的普及,分段锁的设计已经不再是最优选择。因为分段锁的设计会导致每个段只能在一个核上运行,无法充分利用多核处理器的优势。而 Java 8 中的 ConcurrentHashMap 采用了更加灵活的设计,可以充分利用多核处理器的优势。
  3. 简化设计和实现:分段锁的设计相对复杂,需要维护多个段和锁,而 Java 8 中的 ConcurrentHashMap 则采用了更加简洁的设计,简化了实现和维护。

需要注意的是,虽然 Java 8 中的 ConcurrentHashMap 舍弃了分段锁,但仍然采用了分段的思想。它将整个哈希表分成了多个部分(Segment),每个部分都有自己的哈希桶和锁。这种设计既可以减少锁竞争,又可以充分利用多核处理器的优势。同时,Java 8 中的 ConcurrentHashMap 还引入了红黑树等数据结构,以优化哈希冲突的处理。