Java逻辑上部分禁止重排序
实现 是通过内存屏障
是jvm的工具, 我写代码用不到
保证可见性
的2个动作:
刷新
处理器缓存,冲刷
处理器缓存
也是 通过内存屏障
内存屏障 定义
作用是: 禁止编译器和处理器 重排序, 保证有序性
定义
是对一类 仅针对内存读写操作指令 的跨处理器架构 比较抽象的称呼不同处理器指令不同
读写操作是指对主内存的读写
有 刷新
处理器缓存,冲刷
处理器缓存 的副作用, 也保证了 可见性
内部锁的申请释放 字节码指令是
monitorenter
monitorexit
加载屏障 和 存储屏障
作用就是 刷新
处理器缓存,冲刷
处理器缓存
保证 可见性
monitorenter
获得锁以后, Load Barrier
加载屏障, 刷新
处理器缓存
monitorexit
释放锁以后, Store Barrier
加载屏障, 冲刷
处理器缓存
这样使得,
临界区里面的代码, 能拿到最新的值(因为有加载屏障)
运行完以后更新的值也能推送到主内存(因为有存储屏障)
获取屏障 和 释放屏障
获取屏障: 在一个读
操作之后
,禁止它 和之后的操作重排
释放屏障: 在一个写
操作之前
,禁止它 和之前的操作重排
这样把临界区包裹起来 让它不会被重排到外面
临界区内的操作有
原子性
临界区内的重排不管
反正是出来以后 一下子刷给主存, 外部可见
里面重排了外部也看不到, 感知不到, 就是和没重排一样
用了内存屏障的地方
除了 synchronize
网友评论