在两个线程里面A B。A线程用while空语句监视B线程状态值flag,条件是flag为false. B线程的flag不是volatile的。这个时候读取不到B线程对flag的修改。。while(!B.flag){};
flag是成员属性,在堆里面,为啥被拉到寄存器中执行了。java运行时那些值被拉到寄存器存放? 我听说这块是对jvm优化后搞得?
你这个问题就会涉及到多级缓存了,在计算机中,你说的堆就是主存,寄存器是对cpu来说读取最快的,其中还会有多级缓存,一级缓存,二级缓存,三级缓存,最后才是主存;速度的话是寄存器>一级缓存>二级缓存>三级缓存>主存>磁盘。
寄存器和缓存是cpu独占的,多个cpu直接可能会共用缓存,比如三级缓存,cup对数据的操作是按最小单位读取并缓存在多级缓存中,就是叫缓存行,volatile关键字就是cpu在对数据操作时会使缓存中的数据失效,强制通过公共的主存操作数据,使得数据对所有cpu是可见的;
有一种写法叫缓存行对齐,通过冗余字段的方式避免,java有@Contended注解可以了解下
非常感谢你。从这个问题上来理解,堆应该是在主存RAM上的。因为没有volatile的堆数据会被加载到缓存或者寄存器里操作完后刷入主存RAM中。但还有很多说堆是属于二级缓存CACHE,这个怎么理解么?请教下。
@梦再笑: 其实不能说堆的数据属于哪儿,堆的数据可能在内存、磁盘(开启内存交换)、缓存(对内存的缓存)中。对于你的问题“但还有很多说堆是属于二级缓存CACHE”这句话我不知道是在什么场景下说的,没有上下文联系,所以也无法解答。