public class Boy extends Thread {
@Override
public void run() {
while (Bank.money == 10000) {
}
System.out.println("银行里的钱" + Bank.money);
}
}
public class Girl extends Thread {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
Bank.money = 9000;
}
}
public class Test {
public static void main(String[] args) {
Boy b = new Boy();
Girl g = new Girl();
b.start();
g.start();
}
}
public class Bank {
public static int money = 10000;
}
这几段代码很简单,但是我运行是,我发现在boy里面的循环里面没有语句的时候,这个代码就不能停止,这个我是能理解的,
但是一旦我在boy里面的循环里面加了一个输出语句,这个代码运行时就可以停止了,也就是循环结束了?
这个循环怎么能停止呢?
按照我现在的理解,每个线程会持有一个静态变量的副本
在循环里面没有代码的时候,girl线程更新了静态变量的值之后,boy线程不会更新它副本的值(一直保持10000),所以一直循环
在循环里面有输出代码的时候,girl线程更新了静态变量的值之后,boy线程会更新它副本的值(更新为9000),所以不会一直循环(可能是输出代码涉及IO会使得boy线程更新它的副本值)
在静态变量上加volatile
关键字,保证了可见性后(静态变量更新后,boy线程能够立刻看到),循环里面没有代码也可以停止循环
可以参考这个问答,和你的情况类似:https://ask.csdn.net/questio
后面学了JVM和JUC之后,再来看这个问题可能会更简单一些
这个涉及到一个多线程调用静态变量的线程非安全问题,线程非安全也就是说在多线程情况下,可能会出现不符合逻辑的情况,你可以参考下这个帖子
https://blog.csdn.net/qq_43842093/article/details/122992605