在IDEA里面通过ctrl+n搜索ConcurrentHashMap类
这样就得到了ConcurrentHashMap类的源码
再在这个类中通过ctrl+f12查找类中的方法put
在put方法里分析源码看它为什么可以实现线程安全而又高效
在put方法里可以看到它调用了putVal方法
所以需要再到putVal方法里去查看
(最后一句tab = helpTransfer是在给存储hash码值的数组tab扩容)
cas算法
拿期望值去比较要替换的变量
如果一样 就把新值替换上去
如果不一样 就不进行替换
因为当没有人在动要替换的变量时 期望值和要替换的那个变量将会是一样的 反之说明有人在动这个变量 如果进行替换则会产生线程安全的问题
没有替换成功 将会进行回旋 再取替换的变量进行和期望值的比较 直至一样进行替换
即在别人改完后再进行替换 就不会有线程安全的问题
通过这个算法实现线程安全
继续往下看
它针对对应一个hash码值的链表或者红黑树进行上锁
而不是针对所有hash码值的所有链表或红黑树上锁 即分段上锁
通过这种方式实现高效而且线程安全