前言
咱们前几天用金三银四之HashMap剖根问底栏目(一) 和 金三银四之HashMap剖根问底栏目(二)两篇文章从源码层面详细介绍了HashMap的使用和背后的原理,相信看过的小伙伴都有不错的收获,咱们承接前文,继续分享ConcurrentHashMap的实现(后文中C~Map等同ConcurrentHashMap)。
一、ConcurrentHashMap的使用简介
由于和HashMap的使用太过相似,就不写具体的代码了,感兴趣的小伙伴可以自己简单写一写,最主要的区别之一就是ConcurrentHashMap是线程安全的,至于为什么线程安全,等看完我们的系列文章,相信小伙伴们都有非常清晰和深刻的认识。
二、ConcurrentHashMap的初始化
ConcurrentHashMap类的初始化前有一个静态代码块,对一些基础值进行初始化,如下所示:
private static final sun.misc.Unsafe U;
private static final long SIZECTL;
private static final long TRANSFERINDEX;
private static final long BASECOUNT;
private static final long CELLSBUSY;
private static final long CELLVALUE;
private static final long ABASE;
private static final int ASHIFT;
static {
try {
U = sun.misc.Unsafe.getUnsafe();
Class<?> k = ConcurrentHashMap.class;
//获取C~Map的成员变量sizeCtl在对象中的偏移量
SIZECTL = U.objectFieldOffset
(k.getDeclaredField("sizeCtl"));
//同上
TRANSFERINDEX = U.objectFieldOffset
(k.getDeclaredField("transferIndex"));
//同上
BASECOUNT = U.objectFieldOffset
(k.getDeclaredField("baseCount"));
//同上
CELLSBUSY = U.objectFieldOffset
(k.getDeclaredField("cellsBusy"));
Class<?> ck = CounterCell.class;
//获取CounterCell的成员变量value在对象中的偏移量
CELLVALUE = U.objectFieldOffset
(ck.getDeclaredField("value"));
Class<?> ak = Node[].class;
//获取Node[]第一个元素的偏移地址
ABASE = U.arrayBaseOffset