首页 新闻 会员 周边 捐助

volatile 线程之间数据的同步

0
[已解决问题] 解决于 2021-06-17 13:00

我用的是jdk1.8

程序的目的:
让一个新的线程去改变Numberss 实例的ss变量值,然后看main线程是否能得到新线程改变实例变量后的通知,从而看main线程中的Numberss 实例中的ss的值是否会被改变


class Numberss {
    int ss = 1000;

    public void changess() {

        this.ss = 500;
    }
}

public class T {


    public static void main(String[] args) {
        Numberss numberss = new Numberss();

        new Thread(()->{
            try {
                Thread.sleep(3000);
                numberss.changess();
                System.out.println(Thread.currentThread().getName() +" 已经改变 : " + numberss.ss);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        },"aa").start();

        while (numberss.ss ==1000){
            System.out.println(Thread.currentThread().getName() + " 等待-");
        }
        System.out.println(Thread.currentThread().getName()+" end");
        System.out.println(Thread.currentThread().getName()+numberss.ss);

    }




    }



在线程aa中修改了Numberss 中的ss值且ss没有用volatile修饰,main线程竟然访问到了aa线程修改的ss的值。

突破了我对volatile的认知

Prince丶prayK的主页 Prince丶prayK | 菜鸟二级 | 园豆:204
提问于:2020-06-15 10:27
< >
分享
最佳答案
0

总归会同步到内存的,时间问题,反而觉得访问不到才是突破认知吧

奖励园豆:5
56180825 | 小虾三级 |园豆:1749 | 2020-06-16 21:50
其他回答(1)
0

volatile提供了可见性,不代表不使用volatile就百分百不可见,只是不保证了而已

yytxdy | 园豆:1680 (小虾三级) | 2020-06-15 10:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册