ConcurrentHashMap和HashTable
2018-01-29 本文已影响0人
lwz9103
一、HashTable(线程安全)
读方法写写方法都加锁,锁数量太少,竞争激烈
image.png image.png image.png
二、ConcurrentHashMap(线程安全)
对hash值,进行分段加锁,hash值处在同一个segment的进行加锁。
1. 多线程HashMap出现死循环的问题
扩容时,同时调用reHash方法,导致形成环形列表,且有些元素位置错乱。下次获取元素时,可能会在循环列表中获取,但是元素错乱后,无法找到,导致死循环。
2.ConcurrentHashMap分段加锁原理
2.1spread进行分组
image.png
2.2 put操作时
如果hash位置没有元素,采用cas写入元素
image.png
如果hash位置已有元素,且对象相等,则更新
如果hash碰撞,则synchronied加锁操作