存储器层次结构
缓存行
缓存行是为了执行的更快。intel 的缓存行大小是64字节。
伪共享:如果,x,y 在一起。为了提高效率,会一起读到L2 里面,当多线程时,左边L2和右边L2可能都进行了读取。左边L2 修改了X,右边L2修改了Y,这时就需要通知其它CPU进行重新读取,此时需要进行其它cpu的通知。从而影响了效率。
解决:使用缓存行对齐。 jdk8 @Contended 注解
CPU乱序执行:可以提高效率
cpu为了提高指令效率,会在一条指令执行过程中(比如去内存读数据(慢100倍)),去同时执行另一条指令,前提是,两条指令没有依赖关系
比如: int a = 0; int y = 5; a = getm(); y = 9; 这时可能需要 等待执行getm(); 但是 int y = 5; y = 9; 执行不受影响,所以可能会进行乱序执行。
有序性保障: cpu内存屏障 (非JVM内存屏障)
sfence: store| 在sfence指令前的写操作当必须在sfence指令后的写操作前完成。
lfence:load | 在lfence指令前的读操作当必须在lfence指令后的读操作前完成。
mfence:modify/mix | 在mfence指令前的读写操作当必须在mfence指令后的读写操作前完成。