我试图通过递增Executor服务任务中的计数并使用倒计时锁存来等待所有线程启动和停止,然后在读取主线程中的值之前,来模拟一个非线程安全的计数器类.
问题是,当我运行它时,最后的System.out总是返回10作为正确的计数值.当我运行它时,我希望看到一些其他的值,因为这10个线程可能会看到不同的值.
我的代码如下.知道这里发生了什么吗?我在Java 17和IntelliJ Idea上运行它.
Couner.java
public class Counter {
private int counter = 0;
public void incrementCounter() {
counter += 1;
}
public int getCounter() {
return counter;
}
}
#Main.Java#
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
CountDownLatch startSignal = new CountDownLatch(10);
CountDownLatch doneSignal = new CountDownLatch(10);
Counter counter = new Counter();
for (int i=0; i<10; i++) {
executorService.submit(() -> {
try {
startSignal.countDown();
startSignal.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
counter.incrementCounter();
doneSignal.countDown();
});
}
doneSignal.await();
System.out.println("Finished: " + counter.getCounter());
executorService.shutdownNow();
}
}