chencg_2013 2016-08-11 14:59 采纳率: 0%
浏览 1290

两个线程间变量可见性问题,求大神解答

public class RunThread extends Thread{

private  boolean isRunning = true;
private void setRunning(boolean isRunning){
    this.isRunning = isRunning;
}

public void run(){
    System.out.println("进入run方法..");
    while(isRunning == true){
    }
    System.out.println("线程停止");
}

public static void main(String[] args) throws InterruptedException {
    RunThread rt = new RunThread();
    rt.start();
    Thread.sleep(1000);
    rt.setRunning(false);
    System.out.println("isRunning的值已经被设置了false");
}

}


public class RunThread {

private  boolean isRunning = true;
private void setRunning(boolean isRunning){
    this.isRunning = isRunning;
}
public void run1(){
    while(isRunning == true){
    }
}
public static void main(String[] args) throws InterruptedException {
    final RunThread rt = new RunThread();
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            rt.run1();
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            rt.setRunning(false);
        }
    });
    t.start();
    t2.start();
}

}

以上两个程序,对于isRunning变量的线程间可见性,是不一样的,上面的程序不可见,需要加volatile关键字,下面的程序却不需要volatile关键字即可见,这是为什么...

  • 写回答

2条回答 默认 最新

  • dream_lixiang 2016-08-12 02:48
    关注

    两个程序中的isRunning变量对线程一样,线程间变量都不保证可见性。你的第一个程序中在两个线程间使用Thread.sleep(1000)让主线程休眠了1s,第二个程序为什么没有,保持测试程序的一致性,效果是相同的。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败