Java ConcurrentLinkedQueue问题

Java ConcurrentLinkedQueue问题,java,concurrency,Java,Concurrency,请澄清我们是否需要使用显式同步或锁来使用ConcurrentLinkedQueue?我特别想知道以下ConcurrentLinkedQueue方法是否需要同步调用 加 清楚的 大小 size可能是唯一需要显式同步的方法,因为它不是一个原子方法,但ConcurrentLinkedQueue java文档这样说 “注意这一点,与大多数情况不同 集合,则size方法不是 恒定时间操作。因为 这些函数的异步性质 队列,确定当前数量 元素的遍历需要遍历 元素。” 这让我相信,虽然大小调用可能很慢,但它

请澄清我们是否需要使用显式同步或锁来使用ConcurrentLinkedQueue?我特别想知道以下ConcurrentLinkedQueue方法是否需要同步调用

  • 清楚的
  • 大小
size可能是唯一需要显式同步的方法,因为它不是一个原子方法,但ConcurrentLinkedQueue java文档这样说

“注意这一点,与大多数情况不同 集合,则size方法不是 恒定时间操作。因为 这些函数的异步性质 队列,确定当前数量 元素的遍历需要遍历 元素。”

这让我相信,虽然大小调用可能很慢,但它不需要任何显式的同步调用


提前感谢…

您不应该也不需要对这些方法中的任何一种使用显式锁定。

您不需要任何显式同步或锁定。作为状态,它是线程安全的集合。这意味着这些方法中的每一个都是正确的原子方法(尽管正如您所指出的,
size()
可能很慢)。

是的,您不需要使用显式同步,因为这是一个线程安全的集合。任何并发访问都是允许的,不必担心

clear()不是原子操作(它是在AbstractQueue类中实现的),正如Javadoc和source所说:“此实现反复调用poll,直到返回null为止。”。轮询是原子的,但是如果使用明示()时的要约,则会在清除中间添加一些东西,而清除()将删除它…


如果要使用clear(),则应使用LinkedBlockingQueue而不是ConcurrentLinkedQueue。

无需同步以保留队列的内部结构。然而,可能有必要对结构的其他不变量进行线性化

例如,
size()
在任何共享可变容器中都是毫无意义的。它所能告诉你的只是你最后一次问的问题,而不是现在的问题,除非你阻止这个世界并阻止并发修改。它仅用于指示性监视目的,不应在算法中使用它

类似地,如果没有某种外部干预,
clear()
也没有多大意义。清楚什么?当你说清楚的时候,里面的东西是什么?在并行结构中,这是一个即使不是不可能也很难回答的问题

所以,最好将其用作一个简单的线程安全队列(仅提供和轮询),并避开其他队列,除非您在外部锁定