Java 内存模型:存储器、缓存行、伪共享、cpu乱序、指令重排

存储器层次结构

缓存行

缓存行是为了执行的更快。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指令后的读写操作前完成。

猜你喜欢

转载自blog.csdn.net/dandanforgetlove/article/details/106079587