请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,关于可见性的问题

为啥我的代码没有Volatile和Synchronized修饰保证可见性,还是会有可见性呢?

public class SynchronizedClass {
    private int value = 100;

    public static void main(String[] args) throws InterruptedException {
        SynchronizedClass s = new SynchronizedClass();
        SynchronizedThread synchronizedThread = new SynchronizedThread(s);
        Thread t = new Thread(synchronizedThread);
        SynchronizedThread2 synchronizedThread2 = new SynchronizedThread2(s);
        Thread t2 = new Thread(synchronizedThread2);
        t2.start();
        t.start();
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

class SynchronizedThread implements Runnable {
    private SynchronizedClass obj;

    public SynchronizedThread(SynchronizedClass obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        while (obj.getValue() == 100) {

        }
        System.out.println("end");
    }
}

class SynchronizedThread2 implements Runnable {
    private SynchronizedClass obj;

    public SynchronizedThread2(SynchronizedClass obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        obj.setValue(0);
        int i = 0;
        while (true) {
            i++;
        }
    }
}

正在回答

插入代码

1回答

你的代码在大多数情况下可能会出现可见性问题, 无法保证线程的可见性,也就是运行结果随机

某些场景跳出了循环,比如 

在 Java 内存模型中,线程在上下文切换时,可能会强制刷新工作内存(本地缓存),并重新读取主存数据:

1 t2 线程修改了 value=0

2t 线程在 CPU 进行上下文切换时,重新从主内存读取 value,发现 value=0,于是跳出 while 循环

这不是可靠的行为,在不同的 JVM 实现、不同的 CPU 或不同的负载环境下,代码仍然可能出现死循环(即可见性问题)。

如果加了volatile或者synchronized才能保证一定不发生可见性问题

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号