static变量加载到了不同线程的各自工作缓存中,为什么B线程对init变量值的修改在A线程中可见了,这边并未使用volatile修饰init。但是在A线程中添加局部变量后,B线程对init值的修改就对A线程的init值没有影响了,这时A线程中的init一直是0

解决方案 »

  1.   


    一般数据从内存中载入后,jvm不会频繁再次重载数据,而print打印语句会引发当前数据失效,重新载入内存中的数据,所以等于实现了volatile的效果此时变量init全局被重载,init数据被加载入新数据。而第2段程序A线程由于没有执行print语句,jvm不会对数据重载,所以init始终是0
      

  2.   

    上面拼写除问题,应该是A线程中的全局变量init被重载
      

  3.   

    没看太明白,是说init这个static变量被分别加载到A和B两个线程的工作缓存中,因为init变量没有被volatile修饰,所以B线程对init值的修改刷回主内存后,对A线程中工作缓存中的init值没有影响,因为A线程没有执行println(init),所以A线程不会重新载入主内存中的值,就一直是0,是这样子吗
      

  4.   

    每个线程都有自己的一个内存空间,当它第一次从主内存中读取变量的值时,就把变量的值存放在该线程自己的内存空间中,以后在运行的时候,该线程就会从自己的内存中去用该变量的值,而不是从主内存中读取该变量的值,volatile关键字修饰的变量就会使线程每次都会去读取主内存中的变量的值,而不是从自身的内存中读取
      

  5.   


    个人理解,主程序 有主程序的内存, 线程也有自己的独立内存,全局变量需要线程去主程序内存读取数据保存在自己的内存中,线程不会频繁去主程序中读取变量的当前数据这样做会很没效率,而写入时不会有这种情况,因为是全局变量线程在写入数据时,会发送一份新数据给主程序接收后会更新该数据。volatile这个关键字的作用是每当主程序变量数据被改变时,线程中的该变量就会失效,线程在下次使用时会再次从主程序重新读取数据,而print这个语句也能起到这个效果。