multithreading - 锁里面的AtomicInteger有什么用

标签 multithreading concurrency java-8 atomic

在 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 使用两个不同的锁,putLocktakeLock 来允许并发的 puttake 操作在不互相阻塞的情况下进行,假设队列中已经有节点但容量没有耗尽(或根本没有限制)。

所以在这种情况下,count 可能会被两个线程并发访问。由于消费者和生产者线程使用不同的锁,锁本身并没有在生产者和消费者之间建立必要的内存可见性保证,实际上是 count 的原子更新。

除此之外,还有非阻塞操作,如 size()remainingCapacity() ,它们无需持有锁即可访问 count。此外,一些操作,如 peek()poll()(无超时)有一个捷径,在获取锁之前测试 count 为零,当计数为零时立即返回 null 而不锁定。

关于multithreading - 锁里面的AtomicInteger有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45078700/

相关文章:

c# - 'thread safe' 对象是什么意思?

android - 后台工作 - 服务、线程或两者

go - 理解 WaitGroups 的逻辑

java - 新线程卡住应用

java - 从没有空指针异常的 Map 的 Map 的 Map 中获取值

java - 需要一个函数式接口(interface)来操作字符串

java - 如何将这些流式映射键从 Longs 转换为对象?

java - 如何将AnimationTimer与JavaFX应用程序线程分开?

java - 如何中断循环内阻塞的可调用线程?

c++ - 无分支内存管理器?