Java 当地图必须调整大小以容纳更多项目时会发生什么情况?

Java 当地图必须调整大小以容纳更多项目时会发生什么情况?,java,Java,当地图必须调整大小以容纳更多项目时会发生什么情况?如果正在调整大小时另一个线程调用get(),会发生什么情况?如果在调整映射大小时另一个线程调用get(),会发生什么情况,您的问题显示出对Java内存模型缺乏直觉。具体地说,如果使用的MAP实现不是线程安全的,则在调整大小的过程中调用GET()时,或者当MAP完全空闲时,它将是无关的:由于写可见性问题,来自另一个线程的调用总是会被破坏。 简单地说,Java中只有两个条件:线程安全和非线程安全。不需要进一步的细节。如果在调整映射的大小时另一个线程调

当地图必须调整大小以容纳更多项目时会发生什么情况?如果正在调整大小时另一个线程调用get(),会发生什么情况?

如果在调整映射大小时另一个线程调用get(),会发生什么情况,您的问题显示出对Java内存模型缺乏直觉。具体地说,如果使用的MAP实现不是线程安全的,则在调整大小的过程中调用GET()时,或者当MAP完全空闲时,它将是无关的:由于写可见性问题,来自另一个线程的调用总是会被破坏。
简单地说,Java中只有两个条件:线程安全和非线程安全。不需要进一步的细节。

如果在调整映射的大小时另一个线程调用get()会发生什么,您的问题显示出对Java内存模型缺乏直觉。具体地说,如果使用的MAP实现不是线程安全的,则在调整大小的过程中调用GET()时,或者当MAP完全空闲时,它将是无关的:由于写可见性问题,来自另一个线程的调用总是会被破坏。
简单地说,Java中只有两个条件:线程安全和非线程安全。不需要进一步的细节。

我将尝试解释那里将发生什么。以防万一-一个人不应该这样做

就我所理解的
HashMap
implementation而言,如果您使用单个线程对其进行写入,它不会崩溃,但可能找不到您的项。对于两个并发线程,由于
ConcurrentModificationException
,它会很早崩溃

为什么它不会崩溃

  • HashMap
    中的调整大小操作有点原子化——它首先分配表并将项目重新索引到其中,然后用新表替换现有表
  • 表的大小会增加,但不会缩小,所以即使索引函数被破坏,您仍然在范围内
  • get
    永远不会抛出空指针异常-可以检查
    getEntry(对象键)
    是否永远不会抛出
    NullPointerException
为什么它可能找不到您的项目


因为
表[hash(key)]
操作是非原子的。您可能会遇到这样一种情况,即旧映射有一个哈希值,但调整大小后它已经是一个新映射。

我将尝试解释在那里会发生什么。以防万一-一个人不应该这样做

就我所理解的
HashMap
implementation而言,如果您使用单个线程对其进行写入,它不会崩溃,但可能找不到您的项。对于两个并发线程,由于
ConcurrentModificationException
,它会很早崩溃

为什么它不会崩溃

  • HashMap
    中的调整大小操作有点原子化——它首先分配表并将项目重新索引到其中,然后用新表替换现有表
  • 表的大小会增加,但不会缩小,所以即使索引函数被破坏,您仍然在范围内
  • get
    永远不会抛出空指针异常-可以检查
    getEntry(对象键)
    是否永远不会抛出
    NullPointerException
为什么它可能找不到您的项目


因为
表[hash(key)]
操作是非原子的。您可能会遇到这样一种情况,即旧映射有一个哈希值,但调整大小后它已经是一个新映射。

答案是一个词,它将崩溃并引发异常,可能是UnsupportedOperationException。原因是


由于HashMap不是线程安全的,因此当另一个线程尝试读取数据时,它将不允许,并且会发生完全取决于实现的内容。

答案是一个词,它将崩溃并引发异常,可能是UnsupportedOperationException。这背后的原因是


因为HashMap不是线程安全的,所以当另一个线程尝试读取数据时,它将不允许,并且会发生完全依赖于实现的东西。

会发生东西。这完全取决于map的实现。例如,MyPersonalMapWhichCrashesOnAnything会抛出一个UnsupportedOperationException(如果您仔细查看),而HashMap更具弹性。这取决于映射的实现。您是指基于数组的实现吗?@Taylor您是否已将类发布为库?我会对使用它感兴趣。@Taylor:HashMap并没有更具弹性。它不是线程安全的,因此任何事情都有可能发生。@JBNizet HashMap并没有比MyPersonalMap更具弹性,因为MyPersonalMap会破坏任何东西?你听到嗖嗖声了吗?;)事情会发生的。这完全取决于map的实现。例如,MyPersonalMapWhichCrashesOnAnything会抛出一个UnsupportedOperationException(如果您仔细查看),而HashMap更具弹性。这取决于映射的实现。您是指基于数组的实现吗?@Taylor您是否已将类发布为库?我会对使用它感兴趣。@Taylor:HashMap并没有更具弹性。它不是线程安全的,因此任何事情都有可能发生。@JBNizet HashMap并没有比MyPersonalMap更具弹性,因为MyPersonalMap会破坏任何东西?你听到嗖嗖声了吗?;)