阻塞或非阻塞 - 在Java中使用HashMap重新散列期间添加元素

时间:2018-05-15 16:19:46

标签: java hash hashmap blocking nonblocking

正如HashMap的文档中给出的,当HashMap已满75%时,HashMap会在内部执行所有现有对象的重新散列。

如果在执行rehashing时,添加了任何元素 - >

  • 我们是否有HashMap的阻止行为? - 意味着rehashing将首先完成,然后元素将被添加。

  • 我们是否具有HashMap的非阻塞行为 - 意味着重新散列将允许在重新散列过程之间添加元素。

HashMap如何处理在重新散列时添加新元素?

2 个答案:

答案 0 :(得分:1)

来自Javadoc

  

请注意,此实施未同步。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。

您必须应用外部同步;否则,在多线程访问时,地图的状态可能会被破坏。

如果您正在同步,则在地图重新排列时不能添加其他元素。

如果您没有进行同步,则表明您没有使用该类,因此行为未定义。

答案 1 :(得分:1)

它没有阻塞,但它也不会“允许在重组过程之间添加元素”。java.util.HashMap被记录为线程不安全。如果你试图在地图上重新添加或删除,你会得到不一致的行为。

您可能需要考虑使用java.util.concurrent.ConcurrentHashMap