下面是从jdk1.8的源码中的截图,可以得出ConcurrentHashMap是基于 ReentrantLock (AQS) 加上synchronized以及CAS实现的:
也基于segment数组和hashentry数组,被称为分段加锁(比如链中的node)
这也是区别于hashtables的单纯的synchronized效率更高的原因!
那么什么是AQS请参考下面的链接:
java并发编程框架AQS源码
resize的解决方法就是其中之一:cas
同时解决了hashmap线程安全问题:产生循环链表的问题,那么循环链表怎么产生的呢?
多线程同时put时,如果同时调用了resize操作,这个过程就会产生循环链表,代码证明:
在HashMap扩容时,会改变链表中的元素的顺序,将元素从链表头部插入
简要解释:扩容会存在顺序变化,比如之前是0--->A-->B-->NULL
一个线程进行(头插法)扩容了导致 B-->A 由于另外一个线程刚好进行到 a-->b所以这时候循环链表就出现了!a--b--a
后续完善待
参考链接: