gpt4 book ai didi

java - JAVA线程间共享变量

转载 作者:行者123 更新时间:2023-12-02 03:23:57 25 4
gpt4 key购买 nike

我有两个线程对一个公共(public)变量“n”进行计算,一个线程每次增加“n”,另一个线程每次减少“n”,当我没有在这个变量上使用 volatile 关键字时,会发生我无法理解的事情,请帮忙解释一下,代码片段如下:

public class TwoThreads {

private static int n = 0;
private static int called = 0;

public static void main(String[] args) {

for (int i = 0; i < 1000; i++) {
n = 0;
called = 0;

TwoThreads two = new TwoThreads();
Inc inc = two.new Inc();
Dec dec = two.new Dec();
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
while (called != 2) {
//System.out.println("----");
}
System.out.println(n);

}
}

private synchronized void inc() {
n++;
called++;
}

private synchronized void dec() {
n--;
called++;
}

class Inc implements Runnable {
@Override
public void run() {
inc();
}
}

class Dec implements Runnable {
@Override
public void run() {
dec();
}
}

}

1) 我期望的是执行后“n=0,used=2”,但主线程很可能会在 while 循环中被阻塞;

2)但是当我取消注释这一行时,程序按预期运行:

//System.out.println("----");

3)我知道我应该在“叫”上使用“ volatile ”,但我无法解释为什么会发生上述情况;

4)“调用”是在特定线程的工作内存中“读取和加载”,但为什么它不是在“长”while循环之后“存储和写入”回主线程,如果不是,为什么要使用简单的“打印” “线条可以带来如此大的变化

最佳答案

您已同步写入数据(在 inc 和 dec 中),但未同步读取数据(在 main 中)。两者应该同步以获得可预测的效果。否则, main 可能永远不会“看到” inc 和 dec 所做的更改。

关于java - JAVA线程间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227654/

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