java缓存行与volatile

关于缓存行的概念估计不少人都据说过,本章就讲下关于java的volatile关键字与缓存行。
java


CPU 为了更快的执行代码。因而当从内存中读取数据时,并非只读本身想要的部分。而是读取足够的字节来填入高速缓存行。根据不一样的 CPU ,高速缓存行大小不一样。如 X86 是 32BYTES ,而 ALPHA 是 64BYTES 。而且始终在第 32 个字节或第 64 个字节处对齐。这样,当 CPU 访问相邻的数据时,就没必要每次都从内存中读取,提升了速度。 由于访问内存要比访问高速缓存用的时间多得多。缓存


能够看出来,CPU都是很机智的,每次读取不止把本次须要的数据读取进缓存,还会把相邻的数据也读进来,可是这样就有一个问题了,如今的CPU都是多核的,若是有一个数据同时被多个核心缓存,其中一个核心修改了这个数据的值,其余核心的缓存值就失效了,这时程序就出错了。微信


那么,如何应对这种状况呢?java中,能够给字段加上volatile关键字,使用volatile关键字的字段在值被改变后会强制令其余CPU的缓存失效,也就是说一个CPU在另一个CPU改变了volatile修饰的数据后这个CPU会从新从内存读取而不会从缓存读取该数据,保证读取到的是新数据而不是失效数据。性能


能够看出,volatile解决了一个CPU更改数据后另一个CPU不知道的问题,可是,若是使用不当,volatile是会下降程序效率的,下节将分析一个volatile致使的性能问题。.net


若是以为文章不错请长按下方二维码关注公众号,感谢您的支持~内存


本文分享自微信公众号 - java初学者(JoeKerouac_public)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。get

相关文章
相关标签/搜索