gpt4 book ai didi

java - 将递增值插入 ArrayBlockingQueue 和线程安全

转载 作者:行者123 更新时间:2023-12-02 02:40:03 24 4
gpt4 key购买 nike

我知道下面代码中进行的递增不是原子的。我希望增量、插入阻塞队列和打印计数器的值一起成为一个原子操作。我知道原子 int 但我正在尝试使用同步来使其工作以用于学习目的。

int counter = 0;
BlockingQueue<Integer> numbers = new ArrayBlockingQueue<Integer>(100);

while(true) {
numbers.put(counter++);
System.out.println("Inserted new number: " + counter);
}
... // other code that may take things off the numbers queue..

如果我定义一个名为increment()的同步方法来递增、打印和返回并将其传递给numbers.put(increment());,会怎么样?在这种情况下,递增、打印和插入阻塞队列一起是一个原子操作吗?

最佳答案

What if I define a synchronized method called increment() that increments, prints and returns and pass that to numbers.put(increment());? In that situation, would incrementing, printing and inserting into the blocking queue together be one atomic operation?

不,您需要同步这两个操作。

否则以下流程是可能的:

  1. 线程 A 调用 increment(返回 1)
  2. 线程 B 调用 increment(返回 2,该部分有效,因为您同步了该方法,它不会再获得 1)
  3. 线程 B 添加到队列中(现在队列中 1 之前有 2)
  4. 线程 A 添加到队列

这里发生的事情是线程 B “潜入”了线程 A 的两个操作之间。即使您使用 AtomicInteger 来实现计数器,也可能会发生完全相同的事情。防止这种无效交错执行的唯一方法是将两个操作组合在一起并加锁。

关于java - 将递增值插入 ArrayBlockingQueue 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45645268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com