【发布时间】:2017-08-12 00:01:22
【问题描述】:
我知道下面代码中的递增不是原子的。我希望递增、插入阻塞队列和打印计数器的值都是原子操作。我知道原子 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());,会怎样?在那种情况下,增加、打印和插入阻塞队列会是一个原子操作吗?
【问题讨论】:
-
插入会,增量不会,因为它不同步。
-
现在是我们退一步问的时候了,为什么要以原子方式在阻塞队列中插入数字?我的意思是,除了深奥的原因之外,这里有什么用例(如果有的话)?
-
用例 = 学习....
-
您得到了各种形式的答案。
put(counter++)不是原子的,涉及 2 个不同的操作。为了使其原子化,您需要一个外部监视器。还有什么?
标签: java multithreading synchronized