一、HashTable(线程安全)
读方法写写方法都加锁,锁数量太少,竞争激烈
![](https://img.haomeiwen.com/i8956680/aa228bd9507595bb.png)
![](https://img.haomeiwen.com/i8956680/c160088cab918d3a.png)
![](https://img.haomeiwen.com/i8956680/3a9288f10c7ac399.png)
二、ConcurrentHashMap(线程安全)
对hash值,进行分段加锁,hash值处在同一个segment的进行加锁。
1. 多线程HashMap出现死循环的问题
扩容时,同时调用reHash方法,导致形成环形列表,且有些元素位置错乱。下次获取元素时,可能会在循环列表中获取,但是元素错乱后,无法找到,导致死循环。
2.ConcurrentHashMap分段加锁原理
2.1spread进行分组
![](https://img.haomeiwen.com/i8956680/a791039b07cef69f.png)
2.2 put操作时
如果hash位置没有元素,采用cas写入元素
![](https://img.haomeiwen.com/i8956680/652d4e22e3f1bce3.png)
如果hash位置已有元素,且对象相等,则更新
如果hash碰撞,则synchronied加锁操作
网友评论