qq_17751965 2015-10-21 08:53 采纳率: 0%
浏览 1481

一个java多线程的问题

为什么代码中线程VolatileExample 不会终止

package thread;

public class VolatileExample extends Thread{
    private static boolean flag = false;

    @Override
    public void run() {
        while (!flag) {
            //System.out.println(1);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample v = new VolatileExample();
        v.start();
        Thread.sleep(1000);
        flag = true;

    }
}

 package thread;

public class VolatileExample extends Thread{
    private static boolean flag = false;

    @Override
    public void run() {
        while (!flag) {
            System.out.println(1);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample v = new VolatileExample();
        v.start();
        Thread.sleep(1000);
        flag = true;

    }
}

却可以正常终止。
还有这样

 package thread;

public class VolatileExample extends Thread{
    private static volatile boolean flag = false;

    @Override
    public void run() {
        while (!flag) {
            //System.out.println(1);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample v = new VolatileExample();
        v.start();
        Thread.sleep(1000);
        flag = true;

    }
}

线程也可以正常终止。。。求大神指导。。

  • 写回答

1条回答 默认 最新

  • 54powerman 2015-10-21 10:03
    关注
    1. while(!flag) 是一个死循环这毋庸置疑了。

    2. 第二个类,容易理解吧,执行System.out.println,CPU有机会在时间分片间隙,及时获得flag的值,使循环退出;

    3. 第一个类,表面上看起来每次都死锁,但实际上是while{}中间没有任何指令被执行,那么他的时间分片很紧密,很难释放CPU。我理解,不是必然死锁,而是释放的几率比较低,估计试验个∞次可能出现一次能够释放。

    4. 至于volatile,文档里这么说:当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。

      就是说,一旦主线程修改了这个变量的值,run方法能够及时知道,便于退出。

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题