当我的理解有些困惑时,以下事情在测验中向我询问:
1)ConcurrentHashMap
:根据我的理解,没有锁定从此地图获取值(对应于键)。
问题是:如果这是真的,假设t1正在写(通过锁定段/桶)并且t2尝试读取相同,t2将不会获得正确的值,因此t2的值不一致
2)HashMap
:根据我的理解,在将元素添加到hashbucket之前,hashvalue H 计算为hashcode%16(给出0到15之间的值)密钥(key.hashcode())然后添加到哈希值为 H 的存储桶中
注意:有16个存储桶(默认实现),表示ArrayList
LinkedList
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
2000的ArrayList(内存地址)
你可以说这与Segmentation in ConcurrentHashMap,Regarding internal working of concurrent hashmap,HashMap or ConcurrentHashMap at Java Controllers?等重复。但我需要理解疑惑。一些好的解释链接/博客对我有用。感谢
答案 0 :(得分:0)
使用此链接学习ConcurrentHashMap和HashMap
第1部分。你说的是对的。如果在ConcurrentHashMap中找到键,则get()不会对该段进行锁定。如果你有一个正在修改Map结构的另一个线程(例如put())并且尚未完成,那么你肯定会得到过时的值。但是它不会抛出ConcurrentModificationException。如果修改操作在检索操作之前完成,则将反映更新的值。
我希望这会有所帮助。