gpt4 book ai didi

java - ArrayDeque 不为空但 poll 方法返回 null

转载 作者:行者123 更新时间:2023-11-29 03:47:41 25 4
gpt4 key购买 nike

我将此代码(混淆)作为大型应用程序的一部分,它在 object.doSomething() 行上收到了一个 NullPointerException。由于我们刚刚检查了 isEmpty() 调用并且没有其他线程轮询该队列,这怎么可能呢?有其他线程加入队列;是否有可能并发添加永久搞砸了队列?

我尝试阅读 ArrayDeque 的源代码,它使用 head == tail 作为对 isEmpty() 的检查。添加过程中是否可能发生一些奇怪的碰撞使 head != tailhead 指向 null

private final Queue<Task> active = new ArrayDeque<Task>();
if (!this.active.isEmpty()) {
SomeType object = null;
object = this.active.poll();
object.doSomething();
}

最佳答案

即使没有其他线程轮询,也可能有其他线程在推送。

这意味着在并发访问中 tail 可能被错误地修改,如果 tail 被破坏你可能永远不会到达 head == tail 的地步,因此 NullPointerException.

正如@dacwe 所述,文档明确指出您(或此混淆应用程序的开发人员)不应在并发环境中使用 ArrayDeque,这是并发可能出现的问题之一。


They are not thread-safe; in the absence of external synchronization, they do not support concurrent access by multiple threads.


如果你想要一个线程安全的Queue你可以使用 LinkedBlockingQueue , 如果你需要 Dequeue你可以使用 LinkedBlockingDeque .


资源:

关于java - ArrayDeque 不为空但 poll 方法返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com