ConcurrentHashMap

Java Map不是线程安全的,HashTable和Collections同步包装器(Synchronized Wrapper)在并发场景下性能低。Java还为实现 Map 的线程安全提供了并发包,保证线程安全的方式从synchronize简单方式到精细化,比如ConcurrentHashMap。总体来说,并发包内提供的容器通用场景,远优于早期的简单同步实现。ConcurrentHashMap一直在演进,在Java 8中发生了很大的变化(Java 7也有不少更新)。

注:Java 并发包(java.util.concurrent)提供了线程安全容器类,如下,

  • 各种并发容器,比如ConcurrentHashMap、CopyOnWriteArrayList。
  • 各种线程安全队列(Queue/Deque),如ArrayBlockingQueue、SynchronousQueue。
  • 各种有序容器的线程安全版本等。

早期 ConcurrentHashMap 实现基于:

  • 分离锁,将内部进行分段(Segment),里面则是 HashEntry 的数组,和 HashMap 类似,哈希相同的条目是以链表形式存放。
  • HashEntry内部使用 volatile 的 value 字段来保证可见性,也利用了不可变对象的机制改进利用 Unsafe 提供的底层能力(比如 volatile access)去直接完成部分操作,以最优化性能,毕竟 Unsafe 中的很多操作都是 JVM intrinsic 优化过的。

早期 ConcurrentHashMap 内部结构使用分段设计,并发操作时锁定相应段,避免类似HashTable整体同步问题来提高性能。构造时Segment的数量由concurrencyLevel决定,默认是16,也可以在相应构造函数直接指定。Java需要它是2的幂数,如果输入是类似15这种非幂值,会被自动调整到16这种2的幂数。

JDK 7 基本操作源码(分离锁实现并发控制)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值