【发布时间】:2018-09-27 21:54:48
【问题描述】:
我想实现简单的线程安全计数器。数字顺序正确,所以部分没问题,唯一的问题是条件并不总是满足,有时数字会上升到 51 或 52。
我是否应该在 while 循环周围也使用同步标签?
我的意思是,我可以仔细检查并在 printAndIncrement 方法中添加一个条件,但这似乎不太优雅。
public class MyCounter implements Runnable {
static int currentValue = 0;
private static synchronized void printAndIncrement() {
System.out.print(Thread.currentThread().getName() + ": " + currentValue + "\n");
currentValue++;
}
@Override
public void run() {
while (currentValue <= 50) {
printAndIncrement();
}
}
public static void main(String[] args) {
MyCounter counter = new MyCounter();
Thread thread1 = new Thread(counter);
Thread thread2 = new Thread(counter);
Thread thread3 = new Thread(counter);
thread1.start();
thread2.start();
thread3.start();
}
}
【问题讨论】:
-
为什么不使用 AtomicInteger? docs.oracle.com/javase/10/docs/api/java/util/concurrent/atomic/…
-
我一开始使用它,但是虽然增量可以正常工作,但 AtomicInteger 并不能保证打印也会按顺序进行。
-
查找 currentValue 的 volatile 关键字
-
您的真实代码是否按顺序递增和打印数字?
-
@Erik 它似乎也可以工作,但同时我读到这样的 cmets:stackoverflow.com/a/25579778/9660678
标签: java multithreading