请教一个java 多线程的问题

微凉丶
  • 3
新手上路,请多包涵

线程类代码如下 :


public  class TTTT implements Runnable{
    //返回值
    private   int returnVal = 0;
    //标志位
    private  volatile int isOk = 0 ;

    public void run() {
        isOk = 1;
        returnVal = 99;
    }

    public int getReturnVal() {
        while(true){
            if(isOk == 1){
                break;
            }
        }

        //我的想法,这里应该是 == true
        if(returnVal == 0){
            System.out.println(0);
        }
        return returnVal;
    }
}

main方法:

public class test {
    
    public static void main(String[] args) {
        TTTT task = new TTTT();

        //线程t将会执行run方法
        Thread t = new Thread(task);
        t.start();

        //主线程执行getReturnVal
        System.out.println(task.getReturnVal());
    }
}

此时volatile修饰的isOk对于主线程是可见的 , 所以while循环跳出,输出结果为99

问题:变量returnVal并没有使用volitale修饰 , 为什么输出结果不是 0

回复
阅读 840
2 个回答
✓ 已被采纳

名字居然差不多,猿粪呐。运行下面的代码,你可以看出,是有0打印出来的,没加volatitle只是说明不保证可见性,并不是没有可见性。

public class MyThread implements Runnable {
    //返回值
    private int returnVal = 0;
    //标志位
    private volatile int isOk = 0;

    public void run() {
        isOk = 1;
        returnVal = 99;
    }

    public void getReturnVal() {
        while (true) {
            if (isOk == 1) {
                break;
            }
        }
        System.out.println(returnVal);

    }
}

public class RunnableTask {
    public static void main(String[] args) {

        for(int i = 0;i<10000;i++){
            MyThread myThread = new MyThread();
            Thread thread = new Thread(myThread);
            thread.start();
            myThread.getReturnVal();
        }

    }
}

这和volatile没关系,自己线程改了,自己本来就能看到啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏