【968、concurrenthashmap的原理】

19 阅读2分钟

Java 8的ConcurrentHashMap在内部采用了一种不同于早期版本的机制来提供高并发性能,该机制主要依赖于哈希桶数组和CAS(Compare-And-Swap)操作。以下是Java 8 ConcurrentHashMap的主要原理:

  1. 哈希桶数组ConcurrentHashMap内部维护了一个哈希桶数组,这个数组的大小通常是根据ConcurrentHashMap的容量来计算的。每个桶可以包含多个键值对,具有相同哈希码的键值对会被放到同一个桶中。这个哈希桶数组的初始化大小是16,但可以在创建ConcurrentHashMap时指定不同的初始容量。
  2. 分段:Java 8的ConcurrentHashMap不再使用分段锁,而是引入了分段的概念。哈希桶数组被分成一定数量的段(segments),每个段可以看作是一个独立的小型ConcurrentHashMap。每个段上都有一个独立的锁,这样不同的线程可以同时访问不同的段,从而减小了锁的竞争范围。
  3. CAS操作:在Java 8中,ConcurrentHashMap使用CAS操作来实现并发性。CAS是一种原子操作,允许多个线程同时尝试更新共享数据。只有一个线程能够成功,其他线程需要重试。这种机制允许多个线程在不阻塞的情况下尝试修改哈希桶数组中的元素。
  4. 链表和红黑树:每个哈希桶可以包含一个链表或红黑树,具体取决于该桶中键值对的数量。当桶中的元素达到一定阈值时,链表会转化为红黑树,这提高了查找、插入和删除操作的性能,尤其在大型ConcurrentHashMap中。
  5. 扩容:当ConcurrentHashMap需要扩容时,它会对每个段的桶数组进行扩容,而不是整个ConcurrentHashMap。这有助于降低扩容时的锁竞争,因为只有受影响的段需要进行扩容。

总的来说,Java 8的ConcurrentHashMap利用分段、CAS操作和分段的哈希桶数组来提供高并发性能。这种设计使得不同线程可以同时访问不同的段,从而减小锁的粒度,提高了并发性能。此外,采用链表和红黑树来管理每个桶中的键值对,以及精细的扩容策略,都有助于提高性能并降低锁的竞争。