gpt4 book ai didi

java - 将 ConcurrentLinkedQueue 与一些非原子操作一起使用

转载 作者:行者123 更新时间:2023-12-03 12:56:40 24 4
gpt4 key购买 nike

当我们使用诸如 ConcurrentLinkedQueue 甚至一些 BlockingQueue 之类的内置队列之一时,单个调用是原子的并且保证是线程安全的。
但是当对 API 的 5 次调用中,有 4 次调用是单一的,但其中一次调用的形式为:

if(some condition)
{
queue.call();
}

此调用需要在同步块(synchronized block)中,因为此操作是非原子的。
但是引入这个调用不也意味着从现在开始对这个队列的所有访问,无论是读还是写都应该同步?

如果是,我是否可以假设一旦代码中出现一个非原子调用,这很可能,那么所有对花哨队列的访问都必须手动同步?

最佳答案

ConcurrentLinkedQueue不会做出与您假设的完全相同的原子保证。从javadoc:

Memory consistency effects: As with other concurrent collections, actions in a thread prior to placing an object into a ConcurrentLinkedQueue happen-before actions subsequent to the access or removal of that element from the ConcurrentLinkedQueue in another thread.



它与包装 LinkedList 不同。或 Collections.synchronizedList 中的内容;不同的线程可能会看到对 size() 的不同答案,例如,因为它不锁定集合。

根据您的评论,您可能可以将 if 语句替换为对 Queue 的一次调用。的 poll并检查检索到的元素是否为空。

关于java - 将 ConcurrentLinkedQueue 与一些非原子操作一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294210/

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