美文网首页
内存屏障

内存屏障

作者: CodeYang | 来源:发表于2022-11-06 18:28 被阅读0次

    以下截图及相关信息,均来源于马士兵公开课中

    内存屏障

    屏障指的是什么?屏障指的是一种特殊的指令(例如:barrier),只要看到 barrier 就不让前后指令交换顺序,这就是使用屏障禁止指令重排。

    屏障在底层角度:从CPU角度,每种CPU的屏障指令是不一样的,

    例如:Intel(英特尔)

    CPU内存屏障,Intel设计得比较简单,总共只有3条指令:

    ①sfence:也就是save fence,写屏障指令。在sfence指令前的写操作必须在sfence指令后的写操作前完成。

    ②lfence:也就是load fence,读屏障指令。在lfence指令前的读操作必须在lfence指令后的读操作前完成。

    ③mfence:在mfence指令前得读写操作必须在mfence指令后的读写操作前完成。

    Java是跨平台的语言,Java怎么保证在不同的平台,都能够实现呢

    JVM定义规范,定义无论是Linux上的JVM,还是Window上的JVM,还是在Intel CPU上的JVM,我只要使用了Volatile 关键词,哪一个都不允许指令交换顺序。

    实现过程:

    Java级别:

    Volatile 关键词

    JVM内存屏障

    无论哪种CPU或者哪种系统上的JVM必须实现这四种屏障;

    LoadLoad屏障:

    对于这样的语句:Load1;LoadLoad;Load2

    在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据读取完毕。

    即: Load1 读取数据完毕后, Load2才能读取数据

    StoreStore屏障:

    对于这样的语句:Store1; StoreStore; Store2

    在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

    即:Store1写入操作完毕后, Store2才能进行写入操作

    LoadStore屏障:

    对于这样的语句: Load1; LoadStore; Store2

    在Store2及后续代码写入操作被刷出前,保证Load1读取的数据读取完毕。

    即:Load1 读取数据完毕后, Store2才能进行写入操作

    StoreLoad屏障:

    对于这样的语句:Store1; StoreLoad; Load2

    在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。

    即:Store1写入操作完毕后, Load2才能读取数据

    Volatile 的实现细节:
    StoreStoreBarrier Volatile写 StoreLoadBarrier
    Volatile读 StoreLoadBarrier StoreStoreBarrier

    相关文章

      网友评论

          本文标题:内存屏障

          本文链接:https://www.haomeiwen.com/subject/gesvtdtx.html