gpt4 book ai didi

Java 线程安全计数器越界

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:41 25 4
gpt4 key购买 nike

我想实现简单的线程安全计数器。数字顺序正确,所以这部分没问题,唯一的问题是并不总是满足条件,有时数字会上升到 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/

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