缓存行
都是遍历为什么差距就这么大呢?
差距就在缓存上
CPU的缓存是以行为单位的,一次读就读连续的一整行(64字节),失效也是一起失效.
而上面的这种二维数组在内存中的存储时连续的
在加载缓存的时候会把附件的元素也一起读入(因为时连续的)
按行遍历是依照内存的存储顺序依次遍历,缓存的利用率高所以快
而按列遍历时跳跃式的遍历,他不是连续的.这时候缓存的利用率就极低(数组越大越明显),CPU要频繁的去主存中取数据,效率可想而知.
伪共享
相互独立的变量,在同一个缓存行上,这些变量都分别被多个CPU频繁修改,导致整个缓存行经常失效.一个变量改了其他的变量也失效了…
这就非常尬尴了.
缓存行对齐
为了解决上面的尬尴,我们可以手动将一个对象对齐一行.
但是这样有很大的问题,因为不同平台的缓存行,对象大小并不一定时一样的.
这违背了java的核心思想 跨平台
好在jdk1.8以后提供@sun.misc.Contended这个注解可以由jvm帮忙我们实现对齐