Java的SynchronizedMap、ConcurrentHashMap与NonBlockingHashMap的可伸缩性对比 - vmlens


我们来看三种不同的哈希Map,两种来自JDK,另一种来自开源库JCTools

  • SynchronizedMap来自JDK的线程安全哈希Map。它只是用单个锁包围了不是线程安全的HashMap。
  • java.util.concurrent.ConcurrentHashMap是JDK中线程安全哈希Map的专用实现。更新Map时,每个数组元素使用一个锁。对于只读操作,此映射不需要任何锁定,只是volatile 读取。
  • org.jctools.maps.NonBlockingHashMap来自开源库JCTools,不会使用任何锁。对于更新,它改为使用原子比较和设置操作。对于只读操作,它使用类似于ConcurrentHashMap的volatile 读取。该Map仅支持JDK 1.6之前的java.util.concurrent.ConcurrentMap API。

可以在此处从GitHub下载所有基准测试源代码。

比较结果:
1. ConcurrentHashMap和NonBlockingHashMap在读取性能令人印象深刻。
2. NonBlockingHashMap使用原子比较和设置操作,可以实现可伸缩的写入操作。ConcurrentHashMap仅最多可扩展至16个线程,但NonBlockingHashMap最多可扩展至72个线程。