美文网首页
内存屏障(gold_axe)

内存屏障(gold_axe)

作者: 胖达_4b7e | 来源:发表于2020-02-06 13:08 被阅读0次

    https://book.douban.com/subject/27034721/

    Java逻辑上部分禁止重排序实现 是通过内存屏障

    是jvm的工具, 我写代码用不到

    保证可见性的2个动作:
    刷新处理器缓存,冲刷处理器缓存
    也是 通过内存屏障

    内存屏障 定义

    作用是: 禁止编译器和处理器 重排序, 保证有序性

    定义
    是对一类 仅针对内存读写操作指令 的跨处理器架构 比较抽象的称呼

    不同处理器指令不同
    读写操作是指对主内存的读写

    刷新处理器缓存,冲刷处理器缓存 的副作用, 也保证了 可见性

    内部锁的申请释放 字节码指令是
    monitorenter
    monitorexit

    加载屏障 和 存储屏障

    作用就是 刷新处理器缓存,冲刷处理器缓存
    保证 可见性

    内部锁

    monitorenter获得锁以后, Load Barrier 加载屏障, 刷新处理器缓存
    monitorexit释放锁以后, Store Barrier 加载屏障, 冲刷处理器缓存

    这样使得,
    临界区里面的代码, 能拿到最新的值(因为有加载屏障)
    运行完以后更新的值也能推送到主内存(因为有存储屏障)

    获取屏障 和 释放屏障

    获取屏障: 在一个操作之,禁止它 和之后的操作重排
    释放屏障: 在一个操作之,禁止它 和之前的操作重排

    内部锁
    这样把临界区包裹起来 让它不会被重排到外面
    临界区内的操作有原子性

    临界区内的重排不管
    反正是出来以后 一下子刷给主存, 外部可见
    里面重排了外部也看不到, 感知不到, 就是和没重排一样


    用了内存屏障的地方

    除了 synchronize

    volatile字段的读写也用了内存屏障
    禁止重排 高速缓存

    final字段的赋值

    相关文章

      网友评论

          本文标题:内存屏障(gold_axe)

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