我想实现简单的线程安全计数器。数字顺序正确,所以这部分没问题,唯一的问题是并不总是满足条件,有时数字会上升到 51 或 52。
我是否也应该在 while 循环周围使用 synchronized 标签?
我的意思是,我可以仔细检查并在方法 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();
}
}
最佳答案
支票currentValue <= 50
并调用printAndIncrement
必须在同一个同步块(synchronized block)中。否则就会出现这个问题。
让currentValue
为 50。所有三个线程都可以检查当前值是否不超过 50,然后尝试调用 printAndIncrement();
同时。
由于 synchronized void printAndIncrement()
线程将按顺序执行此方法,但对于第一个线程,currentValue
将为 50,第二个线程将为 51,第三个线程将为 52。
关于Java 线程安全计数器越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49886447/