gpt4 book ai didi

java - Java生产者使用者问题中使用Atomic Integer的奇怪输出

转载 作者:行者123 更新时间:2023-12-03 13:22:49 25 4
gpt4 key购买 nike

当使用BlockingQueue在Java中实现生产者-消费者问题时,使用AtomicInteger获得奇怪的输出,其中2个线程正在产生相同的结果并将相同的计数器变量放入队列中。考虑到Atomic Integer使用的比较和交换技术,该输出怎么可能?

import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class ProducerConsumer {
static BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(25);
static AtomicInteger counter=new AtomicInteger(0);
public static void main(String[] args) throws Exception{

Runnable producer = () -> {
while(!Thread.currentThread().isInterrupted()){
try {
final int e = counter.incrementAndGet();
queue.put(e);
if(e==26){
System.out.println("this is breaking the sequence...., value 26");
}
// System.out.println("Producer has produced the data:" +e);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};

ExecutorService producerPool = Executors.newFixedThreadPool(25);
for(int i=0; i<10;i++){
producerPool.submit(producer);
}

Thread.sleep(3000);
Scanner scanInput= new Scanner(System.in);
if(scanInput.next() != null){
producerPool.shutdownNow();
}
}

}
它产生如下的输出,其中计数器达到26
this is breaking the sequence...., value 26
在不同的运行中也可以产生以下结果:计数器最多只能达到25,这是正确的
no output
我知道我没有使用任何同步来更新计数器值并将其放在队列中,这将解决序列输出问题,但是我的关注点是了解Atomic Integer的工作原理,以及在这种情况下它不适合的情况。
关于此行为的任何想法。谢谢。

最佳答案

截至目前,您正在使用AtomicInteger方法打印toString

"Producer has produced the data:" + Thread.currentThread().getName() + " : " + counter
您需要提取 AtomicInteger
final int e = counter.incrementAndGet();
queue.put(e);
System.out.println("Producer has produced the data:" + Thread.currentThread().getName() + " : " + e);
如果以前没有提取它,则在调用 toString时,该值可能已由另一个线程更新。它将不再是原子的。

关于java - Java生产者使用者问题中使用Atomic Integer的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66087406/

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