【发布时间】:2014-07-23 01:50:25
【问题描述】:
我有seen something,它解释了 HashMap 在多线程中不安全的原因。
它说,当做resize时,链表中的整个对象序列被颠倒了,并给出了例子:
例如,假设有 3 个具有相同哈希码的键,因此存储在存储桶内的链表中[以下格式为 object_value(current_address, next_address)]
初始结构:1(100, 200) --> 2(200, 300) --> 3(300, null)
通过 thread-1 调整大小后:3(300, 200) --> 2(200, 100) --> 1(100, null)
当线程 2 开始调整大小时,它再次从第一个元素开始,将其放在头部:
1(100, 300) --> 3(300, 200) --> 2(200, 100) ==> 成为下一次插入的无限循环,线程在这里挂起。
我对这个例子很困惑,
初始结构:1 -> 2 -> 3
线程1:3->2->1
线程 2:1 -> 3 ->2 为什么?
谁能帮我分析这个例子或展示一个更详细的例子?谢谢。
【问题讨论】:
-
哦,拜托。当您可以更轻松地发布原始文本时,您是否必须创建和发布图片?为什么要在这个史诗般的规模上浪费时间和空间?考虑到答案是在引用的同一段中给出的,很难看出你为什么要发布这个问题。
-
我对你的问题感到困惑:你有兴趣知道为什么内部链表被反转了吗?或者你想知道为什么 HashMap 不是线程安全的?
-
我试着按照那篇文章的逻辑。我查看了 HashMap 的源代码以了解该无限循环是如何形成的,但看不到它。因此,我也不介意解释。
标签: java multithreading hashmap