![]() |
1
2
据我所知, ConcurrentLinkedQueue 是“无等待”实现。
所以我必须假设每个独立的呼叫
此集合上的原子操作是同步的,对队列的每个单独调用都保证线程安全。 您的代码一定有问题。例如,如果您这样做:
不是这样吗?
|
![]() |
2
0
根据JavaDoc,似乎peek()和poll()永远不会阻塞。我做了一个快速的生产者/消费者测试,没有遇到任何阻碍。 |
![]() |
3
0
我不认为你的问题是因为这个,但是poll()和peek()可以(至少理论上)阻止: 顾名思义,ConcurrentLinkedQueue是作为链接列表实现的。当轮询或扫视时,实现尝试从头部开始并遍历链接的节点,尝试查找未删除的节点。如果找到一个非空节点,它将返回该节点;如果到达末尾,它将返回队列为空,但如果找到一个已删除的节点,它将重试。 所以考虑这个序列。p是一个生产者线程,我们有两个消费者线程c1和c2:
所以poll()和peek()将被阻塞,直到它们可以确定队列是否为空。 但是,除非您使用一些非常奇怪的线程优先级,否则这种情况是 高度地 不太可能,我建议你到别处找你的bug。 |
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 3 年前 |
![]() |
Grant · goroutines有高空闲唤醒电话 3 年前 |
![]() |
hoaz · 如何安全地清理并发映射 7 年前 |
![]() |
Alanpatchi · int基元类型的volatile声明 7 年前 |