hehiii 2022-05-11 21:43 采纳率: 50%
浏览 53
已结题

新人学java,有没有哪位,能解惑,关于java线程

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里面的循环里面加了一个输出语句,这个代码运行时就可以停止了,也就是循环结束了?
这个循环怎么能停止呢?

  • 写回答

2条回答 默认 最新

  • yiiiiiiim 2022-05-12 00:27
    关注

    按照我现在的理解,每个线程会持有一个静态变量的副本

    • 在循环里面没有代码的时候,girl线程更新了静态变量的值之后,boy线程不会更新它副本的值(一直保持10000),所以一直循环

    • 在循环里面有输出代码的时候,girl线程更新了静态变量的值之后,boy线程会更新它副本的值(更新为9000),所以不会一直循环(可能是输出代码涉及IO会使得boy线程更新它的副本值)

    在静态变量上加volatile关键字,保证了可见性后(静态变量更新后,boy线程能够立刻看到),循环里面没有代码也可以停止循环
    可以参考这个问答,和你的情况类似:https://ask.csdn.net/questio
    后面学了JVM和JUC之后,再来看这个问题可能会更简单一些

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月20日
  • 已采纳回答 5月12日
  • 创建了问题 5月11日

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)