当必须调整地图大小以容纳更多项目时会发生什么?如果另一个线程在调整大小时调用get()会发生什么?
答案 0 :(得分:4)
关于在调整地图大小时另一个线程调用get()会发生什么情况的问题表明,对Java内存模型缺乏直觉。具体来说,如果你使用的地图实现不是线程安全的,那么在调整get()时 - 在调整大小的过程中或者当地图完全处于空闲状态时,它将无关紧要:来自另一个线程的调用总是< / em>由于写入可见性问题而被破坏。
简单地说,Java中只有两个条件:线程安全而不是线程安全。不需要进一步的细节。
答案 1 :(得分:0)
我会尝试解释那里会发生什么。以防万一 - 不应该这样做。
据我了解HashMap
实现,如果您使用单个线程写入它,它不会崩溃,但可能找不到您的项目。对于两个并发线程,由于ConcurrentModificationException
,它会很早崩溃。
为什么它不会崩溃
HashMap
中的调整大小操作有点原子 - 它首先分配您的表并将项重新索引到其中,然后用新的表替换现有的表get
永远不会抛出空指针异常 - 可以检查getEntry(Object key)
永远不会抛出NullPointerException
。为什么找不到您的商品
因为table[hash(key)]
操作是非原子的。当您拥有旧地图的哈希值时,可能会遇到这种情况,但在调整后,它已经是新地图了。
答案 2 :(得分:0)
答案是一个单词它会崩溃并抛出异常可能是UnsupportedOperationException。这背后的原因是..
由于HashMap不是线程安全的,所以当另一个线程尝试读取数据时,它将不允许,并且会发生完全依赖于实现的东西。