在 java.util.concurrent.LinkedBlockingQueue.put() 方法的这一部分中,我认为不需要 AtomicInteger。考虑到 lock() 中只有一个线程。我对么?
putLock.lockInterruptibly();
try {
while (count.get() == capacity) {
notFull.await();
}
enqueue(node);
c = count.getAndIncrement();
if (c + 1 < capacity)
notFull.signal();
} finally {
putLock.unlock();
}
我查了很多问题,但找不到答案。我的问题:锁内只有一个线程,为什么在这里使用 AtomicInteger
最佳答案
LinkedBlockingQueue
使用两个不同的锁,putLock
和 takeLock
来允许并发的 put
和 take
操作在不互相阻塞的情况下进行,假设队列中已经有节点但容量没有耗尽(或根本没有限制)。
所以在这种情况下,count
可能会被两个线程并发访问。由于消费者和生产者线程使用不同的锁,锁本身并没有在生产者和消费者之间建立必要的内存可见性保证,实际上是 count
的原子更新。
除此之外,还有非阻塞操作,如 size()
或 remainingCapacity()
,它们无需持有锁即可访问 count
。此外,一些操作,如 peek()
和 poll()
(无超时)有一个捷径,在获取锁之前测试 count
为零,当计数为零时立即返回 null
而不锁定。
关于multithreading - 锁里面的AtomicInteger有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45078700/