一、关于分段锁
集合框架很大程度减少了java程序员的重复劳动。在Java多线程环境中,以线程安全的方式使用集合类是一个首先考虑的问题。
能够保证线程安全的哈希表中,ConcurrentHashMap是大家都熟知的,也知道它内部使用了分段锁。然而,随着Java语言的快速发展,分段锁已经是历史了。
在Java8中,你看不到分段锁的身影。Java7中,Segment继承于ReentrantLock使用了显示锁,在Segment的实例方法中,每个更新操作内部又使用Unsafe来处理更新。这显然是一种浪费。显示锁、Unsafe 这二者都是可以保证对对象的原子操作。使用一个即可。
Java7中的数据存储在数组 final Segment<K,V>[] segments; 这个一个特定大小的Segment数组,
Segment继承于ReentrantLock 故而可以在更新操作时使用显示锁。
二、内部类 Segment
三、Java8
Java8中,ConcurrentHashMap较之前版本有了很大的改变。
使用Node数组替代了Segment数组来存储数据。Node数组中不再使用显示锁,而是Unsafe的乐观锁机制。
Segment予以保留,仅用来处理对象流的读写。