【发布时间】:2021-08-25 08:21:38
【问题描述】:
我怎样才能实现这里的 while 循环总是准确执行 100 次。当我执行代码时,在极少数情况下,它会在控制台上打印 99 或 98 行,而不总是 100 行,我不明白。
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
public class Print implements Runnable {
static AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public void run() {
while (atomicInteger.getAndIncrement() < 100)
System.out.println(Thread.currentThread());
}
public static void main(String[] args) throws InterruptedException {
ArrayList<Thread> threads = new ArrayList<>();
for (int i = 0; i < 5; i++)
threads.add(new Thread(new Print()));
for (Thread thread : threads)
thread.start();
for (Thread thread : threads)
thread.join();
}
}
【问题讨论】:
-
这段代码应该可以工作,因为
getAndIncrement是线程安全的,你确定它只打印 98 或 99 次吗? -
谢谢卡罗尔。 IDE 或在后台运行的其他程序会影响输出吗?我试图重现该问题,但无法重现。我已经在 Excel 中复制了控制台输出,我确信它曾经是 98 行和其他 99 行。
-
我无法重现您的问题,而且代码看起来正确,我不知道您怎么会收到 98 或 99 而不是 100。
-
计数部分在我看来还可以。我对并行 println 调用有一点怀疑; description 建议打印值和打印行终止符是不同的操作,我想 可能 会导致两个值后跟两个换行符 - 但是你会得到明显错误的输出。
标签: java thread-safety atomicinteger