2 jgx000 jgx000 于 2017.08.31 18:06 提问

java多线程内存可见性问题,求助大牛

public class NoVisibility {
private static boolean ready;
private static int num;

public static void main(String[] args) throws InterruptedException {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (!ready) {
            }
            System.out.println("num:" + num);
        }
    }).start();
    Thread.sleep(1000);
    num = 20;
    ready = true;
}

}
求助各位大牛,上面的代码在-server的jvm中 无限循环,一直没想通,主线程设置ready=true,循环的线程为什么会无限循环呢?

1个回答

Small_Mouse0
Small_Mouse0   Rxr 2017.09.01 00:07

Thread.sleep(1000);,,,主线程停了1秒,,,然后等待cpu,,,一直竞争不到,

所以ready = true;,,,没执行,,

【1】可以设置线程的优先级,,吧你这个线程优先级降低一点,,
【2】while循环里加点耗时操作,,

Small_Mouse0
Small_Mouse0 回复GuangxingJiang: 这里我确实答错了,,,不好意思,,上面代码死循环是因为,子线程中的ready没和主线程中的ready同步,换句话说,子线程有个拷贝的ready,一直用拷贝的这个ready肯定是死循环,,给,ready加个修饰词就行【volatile】保证数据的一致性
大约一个月之前 回复
Small_Mouse0
Small_Mouse0 回复GuangxingJiang: 好久之前帖子了,,,竞争肯定是有的,两个线程并发运行,竞争是必然的,,,这里
大约一个月之前 回复
jgx000
jgx000 主线程和子线程没有竞争关系的啊
大约一个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!