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

时间:2013-11-11 18:44:51

标签: java

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

3 个答案:

答案 0 :(得分:4)

关于在调整地图大小时另一个线程调用get()会发生什么情况的问题表明,对Java内存模型缺乏直觉。具体来说,如果你使用的地图实现不是线程安全的,那么在调整get()时 - 在调整大小的过程中或者当地图完全处于空闲状态时,它将无关紧要:来自另一个线程的调用总是< / em>由于写入可见性问题而被破坏。

简单地说,Java中只有两个条件:线程安全而不是线程安全。不需要进一步的细节。

答案 1 :(得分:0)

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

据我了解HashMap实现,如果您使用单个线程写入它,它不会崩溃,但可能找不到您的项目。对于两个并发线程,由于ConcurrentModificationException,它会很早崩溃。

为什么它不会崩溃

  • HashMap中的调整大小操作有点原子 - 它首先分配您的表并将项重新索引到其中,然后用新的表替换现有的表
  • 表大小增长,但不会缩小,因此即使索引功能损坏,您仍然在范围内。
  • get永远不会抛出空指针异常 - 可以检查getEntry(Object key)永远不会抛出NullPointerException

为什么找不到您的商品

因为table[hash(key)]操作是非原子的。当您拥有旧地图的哈希值时,可能会遇到这种情况,但在调整后,它已经是新地图了。

答案 2 :(得分:0)

答案是一个单词它会崩溃并抛出异常可能是UnsupportedOperationException。这背后的原因是..

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