gpt4 book ai didi

java静态字段会在线程之间同步吗?

转载 作者:行者123 更新时间:2023-12-02 13:18:30 25 4
gpt4 key购买 nike

public class ThreadsDemo {
public static int n = 0;
private static final int NTHREADS = 300;

public static void main(String[] argv) throws InterruptedException {
final CountDownLatch cdl = new CountDownLatch(NTHREADS);
for (int i = 0; i < NTHREADS; i++) {
new Thread(new Runnable() {
public void run() {
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
n += 1;

cdl.countDown();
}
}).start();
}

cdl.await();
System.out.println("fxxk, n is: " + n);
}
}

为什么输出是“n is: 300”? n 没有明确同步。如果我取消注释“Thread.sleep”,则输出为“n is: 299 or less”。

最佳答案

我这样改变了你的代码:

private static final int NTHREADS = 300;
private static AtomicInteger n = new AtomicInteger();

public static void main(String[] argv) throws InterruptedException {
final CountDownLatch cdl = new CountDownLatch(NTHREADS);
for (int i = 0; i < NTHREADS; i++) {
new Thread(new Runnable() {
public void run() {
n.incrementAndGet();
cdl.countDown();
}
}).start();
}
cdl.await();
System.out.println("fxxk, n is: " + n);
}

你必须应对赛车条件。所有 300 个线程都同时修改 n。例如:如果两个线程同时读取并递增 n ,则两个线程都将 n 递增到相同的值。

这就是为什么 n 并不总是 300 的原因,在这种情况下您会丢失一个增量。这种情况可能发生零次或多次。

我将nint更改为AtomicInteger,这是线程安全的。现在一切都按预期进行。

关于java静态字段会在线程之间同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43672661/

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