多线程,static变量与volatile static变量加载到了不同线程的各自工作缓存中,为什么B线程对init变量值的修改在A线程中可见了,这边并未使用volatile修饰init。但是在A线程中添加局部变量后,B线程对init值的修改就对A线程的init值没有影响了,这时A线程中的init一直是0 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般数据从内存中载入后,jvm不会频繁再次重载数据,而print打印语句会引发当前数据失效,重新载入内存中的数据,所以等于实现了volatile的效果此时变量init全局被重载,init数据被加载入新数据。而第2段程序A线程由于没有执行print语句,jvm不会对数据重载,所以init始终是0 上面拼写除问题,应该是A线程中的全局变量init被重载 没看太明白,是说init这个static变量被分别加载到A和B两个线程的工作缓存中,因为init变量没有被volatile修饰,所以B线程对init值的修改刷回主内存后,对A线程中工作缓存中的init值没有影响,因为A线程没有执行println(init),所以A线程不会重新载入主内存中的值,就一直是0,是这样子吗 每个线程都有自己的一个内存空间,当它第一次从主内存中读取变量的值时,就把变量的值存放在该线程自己的内存空间中,以后在运行的时候,该线程就会从自己的内存中去用该变量的值,而不是从主内存中读取该变量的值,volatile关键字修饰的变量就会使线程每次都会去读取主内存中的变量的值,而不是从自身的内存中读取 个人理解,主程序 有主程序的内存, 线程也有自己的独立内存,全局变量需要线程去主程序内存读取数据保存在自己的内存中,线程不会频繁去主程序中读取变量的当前数据这样做会很没效率,而写入时不会有这种情况,因为是全局变量线程在写入数据时,会发送一份新数据给主程序接收后会更新该数据。volatile这个关键字的作用是每当主程序变量数据被改变时,线程中的该变量就会失效,线程在下次使用时会再次从主程序重新读取数据,而print这个语句也能起到这个效果。 session循环赋值问题 学习JAVA的新手,我觉得java很像C++,可是我遇到难以启齿的问题了 改错 Overriding与Overloading 用栈实现算数表达式求结果的问题! 一个仿迅雷软件,从网上下载软件遇到的问题 一个程序如果return的话,return 到什么地方?? Swing界面,想实现一个拖放动作,怎么搞? 为何程序执行不了? 自己写Skin Look And Feel和Layout应该怎么写? Java刚入门,对着书自己打了一行代码,一直报错。求解! idea maven引入jar包失败,求大神执导
一般数据从内存中载入后,jvm不会频繁再次重载数据,而print打印语句会引发当前数据失效,重新载入内存中的数据,所以等于实现了volatile的效果此时变量init全局被重载,init数据被加载入新数据。而第2段程序A线程由于没有执行print语句,jvm不会对数据重载,所以init始终是0
个人理解,主程序 有主程序的内存, 线程也有自己的独立内存,全局变量需要线程去主程序内存读取数据保存在自己的内存中,线程不会频繁去主程序中读取变量的当前数据这样做会很没效率,而写入时不会有这种情况,因为是全局变量线程在写入数据时,会发送一份新数据给主程序接收后会更新该数据。volatile这个关键字的作用是每当主程序变量数据被改变时,线程中的该变量就会失效,线程在下次使用时会再次从主程序重新读取数据,而print这个语句也能起到这个效果。