cup乱序执行
(1)、介绍:cpu在进行读等待的同时执行指令,cpu乱序的根源,不是乱,而是提升效率,如上图,若是指令1和指令2没有依赖关系,指令2会优先执行,由于从内存获取指令1须要等待
(2)、致使的问题:DCL单例为何要加volatile(volatile能够禁止指令重排),由于对象初始化有个中间态,这个时候若是发生指令重排,会有问题,以下图:
(3)、如何禁止指令重排segmentfault
(3-1)、CPU层面:内存屏障:一、sfence:在sfence指令前的写操做当必须在sfence指令后的写操做前完成。二、Ifence:在Ifence指令前的读操做当必须在Ifence指令后的读操做前完成。三、mfence:在mfence指令前的读写操做当必须在mfence指令后的读写操做前完成 锁总线:intel lock汇编指令:原子指令,如x86上的“lock...”指令是一个Full Barrier,执行时会锁住内存子系统来确保执行顺序(其实是锁内存总线),甚至跨多个CPU,Software Locks一般使用了内存屏障或原子指令来实现变量的可见性和保存程序顺序 (3-2)、jvm层面(8个hanppens-before原则 4个内存屏障(LL LS SL SS)): JSR内存屏障(cpu的lock指令):对于cpu的原语(sfence、Ifence、mfence)不是每一个cpu都有,而lock指令是大部分cpu都有的,因此jvm采用了偷懒的方式
NUMA(Non Uniform Memory Access)非统一访问内存,在主板上有不一样的插槽,每一个cpu都有一块离本身最近的内存,本身的访问优先级最高(也能够访问别人家的内存,只是效率稍低一些),以下图:
4.拓展:as if serial 无论如何重排序,单线程执行结果不会变,看起来像正常的顺序执行同样,好比a=1;y=b;这两条绝不相关的指令,是能够进行重排序的缓存
上一篇:https://segmentfault.com/a/11...
下一篇:https://segmentfault.com/a/11...jvm