currentHashMap详解

CurrentHashMap对比HashMap而言是一个线程安全的map,和HashTable不同的是,线程安全实现的方法不同,同时效率更高。

Map 特点
HashMap 底层是数组+(链表|红黑树)的数据结构,是线程不安全的,key中可以存储null
HashTable 底层实现和HashMap一样,但是是线程安全的,通过使用sychronized对get,add方法进行了同步,但是锁的粒度太大,效率较低,key,value中不可以存储null
CurrentHashMap 底层也是hash的,同时也是线程安全的,效率比HashTable更高,大量使用了volatile,final,CAS等技术来减少锁竞争对于性能的损失。同时1.7和1.8的实现方法有点不同

CurrentHashMap在jdk1.7中的实现原理

数组+Segment+分段锁实现的

image-20201004215651077

其中会有两次hash的过程,第一次hash用来找到对应的segment,第二次hash找到元素所在链表的头部

该结构所带来的的

好处是:只用对Segment加锁,这样相对于对整个hashMap的get,add方法加锁,提高了性能

坏处是:对比普通的HashMap需要两次hash的过程

CurrentHashMap在jdk1.8中的实现

CurrentHashMap在jdk1.8的实现参考了HashMap在1.8中的底层实现,使用了数组+链表,红黑树的数据结构来实现,同时用了CAS操作(Compare and swap)。

CAS:即比较交换,是乐观锁。(在java中有分为乐观锁和悲观锁,注意悲观锁和乐观锁的定义)性能比较乐观锁性能较悲观锁更高。

CAS中主要包含三个操作数:内存位置V,预期原值A和新值B,如果内存地址里面的值和A是一样的,那么就将内存里面的值更新成B,