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

时间:2012-04-24 08:18:15

标签: java multithreading queue

当我们使用其中一个内置队列(如ConcurrentLinkedQueue或甚至某些BlockingQueue)时,单个调用是原子的,并保证是线程安全的。 但是,当对5个API调用时,4个调用是单个调用,但是一个调用的形式是:

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

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

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

1 个答案:

答案 0 :(得分:3)

ConcurrentLinkedQueue没有做出你所假设的完全相同的原子保证。来自javadoc:

  

内存一致性效果:与其他并发集合一样,   在将对象放入a之前的线程中的动作   ConcurrentLinkedQueue发生在访问之后的操作之前   或从另一个中的ConcurrentLinkedQueue中删除该元素   线程。

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

根据您的评论,您可以通过一次调用Queue的{​​{1}}来替换if语句,并检查检索到的元素是否为空。