当我们使用其中一个内置队列(如ConcurrentLinkedQueue或甚至某些BlockingQueue)时,单个调用是原子的,并保证是线程安全的。 但是,当对5个API调用时,4个调用是单个调用,但是一个调用的形式是:
if(some condition)
{
queue.call();
}
此调用需要位于同步块中,因为此操作是非原子操作。 但是,不引入此调用也意味着从现在开始应该同步所有对此队列的访问,无论是读取还是写入?
如果是,我是否可以假设一旦单个非原子调用在代码中蔓延,这很可能,那么所有对花哨队列的访问都必须手动同步?
答案 0 :(得分:3)
ConcurrentLinkedQueue
没有做出你所假设的完全相同的原子保证。来自javadoc:
内存一致性效果:与其他并发集合一样, 在将对象放入a之前的线程中的动作 ConcurrentLinkedQueue发生在访问之后的操作之前 或从另一个中的ConcurrentLinkedQueue中删除该元素 线程。
与在LinkedList
中包裹Collections.synchronizedList
或其他内容不同;例如,不同的线程可能会看到size()
的不同答案,因为它不会锁定集合。
根据您的评论,您可以通过一次调用Queue
的{{1}}来替换if语句,并检查检索到的元素是否为空。