【问题标题】:How can multiple threads corrupt internal structure of Hashmap多线程如何破坏Hashmap的内部结构
【发布时间】:2023-03-22 01:01:01
【问题描述】:

Java 8 for the Really ImpatientHorstmann 写道:

如果多个线程修改一个普通的 HashMap,它们可以销毁 内部结构。一些链接可能会丢失,甚至进入 圆圈,使数据结构不可用。 (第 6.2.1 节

我可以理解不同步的并发访问会损坏我的数据。如果两个线程都更新相同的值,一个可以覆盖另一个。

但它为什么以及如何破坏内部内存结构?

【问题讨论】:

  • 内部内存是指thing - HashMap 实现的一些Colleciton of Entry 内部结构,用于保存HashMap 的数据。
  • 如果您了解非同步并发访问可能会破坏“您的数据”,那么意识到它可能会破坏HashMap 以及“您的数据”和“内部数据”的结构应该是一小步。 HashMap 的内存结构”是一回事:Java 堆上的一堆对象。
  • @Holger 电脑和我的午餐盒是一样的,因为它们是塑料的。数据是用户提供的值,内部结构是底层数据结构中的指针。从 5000 到 -3838 的薪水数额如何破坏指针并不是很明显。因此问题。
  • @Kshitiz Sharma:你认为计算机为什么要区分“用户提供的值”和“底层数据结构中的指针”? CPU 不知道“用户”是什么,也不知道是谁提供了它处理的字节。如果你真的想学习多线程编程,我推荐阅读 Brian Goetz 等人的“Java Concurrency in Practice”。
  • @Holger The computer 没有。 JVM 确实而且应该。无法从 Java 访问内存引用。当甚至无法访问这些内容时,如何破坏这些内容? Java 不应该好好管理它们吗?不是很明显。因此问题。

标签: java multithreading concurrency java-8


【解决方案1】:

this 博文中完美解释了您所寻求的答案。

如果您通读它,您会发现竞争条件会破坏存储桶中项目之间的指针,从而导致查找变成两个项目之间的无限遍历。

我不确定 HashMap 的实现对于 Java 8 有多大的改变,但我怀疑这些基础知识仍然适用。

我还要补充一点,这个问题并不难遇到,我在现实生活中的生产系统中确实看到过!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多