• JUC之volatile关键字


    Volatile
    volatile修饰的变量有两大特点:可见性与有序性
    volatile的内存语义
    在这里插入图片描述
    volatile凭什么可以保证可见性和有序性???内存屏障 Memory Barrier

    内存屏障
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    四大屏障
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    Volatile保证可见性、没有原子性,指令禁重排。
    保证可见性:保证不同线程对某个变量完成操作后结果及时可见,即该共享变量一旦改变所有线程立即可见。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    volatile不保证原子性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    volatile变量不适合参与到依赖当前值的运算

    重排序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    volatile写操纵,在volatile变量之前与之后加了两种类型的内存屏障的代码含义演示,禁止指令重排
    在这里插入图片描述
    volatile读之后的操作,都禁止重排序待volatile之前
    在这里插入图片描述
    volatile的使用场景
    1.单一赋值2.状态标志3.开销较低的读、写锁策略4.双重锁校验

    在这里插入图片描述
    状态标志位使用场景演示
    在这里插入图片描述
    开销较低的读、写锁策略
    在这里插入图片描述
    双重锁校验
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    解决隐患思路:利用volatile,禁止“初始化对象(2)”和“设置singleton指向内存空间(3)”的重排序

    volatile总结

    可见性
    在这里插入图片描述
    有序性(禁止指令重排)
    写指令
    在这里插入图片描述
    读指令
    在这里插入图片描述
    字节码层面
    在这里插入图片描述
    内存屏障是什么?
    内存屏障: 是一种屏障指令,它使得CPU或者编译器对屏障指令的前和后所发出的内存操作,执行一个排序的约束。也叫内存栅栏或栅栏指令
    内存屏障能干嘛
    阻止屏障两边的指令重排序,写数据时加入屏障,强制将线程私有工作内存的数据刷回主物理内存。读数据时加入屏障,线程私有工作内存的数据失效,重新到主物理内存中获取最新数据。
    内存屏障的四大指令
    1.在每一个volatile写操作前面插入一个StoreStore屏障
    2.在每一个volatile写操作后面插入一个StoreLoad屏障
    3.在每一个volatile读操作后面插入一个LoadLoad屏障
    4.在每一个volatile读操作后面插入一个LoadStore屏障

    在这里插入图片描述

  • 相关阅读:
    群面的技巧
    猿创征文|零基础python学习之旅(简短又漫长)
    YOLOv7独家改进:Multi-Dconv Head Transposed Attention注意力,效果优于MHSA| CVPR2022
    spring-cloud-dubbo基本使用
    解决transform带来的z-index失效问题
    监听Helm release资源
    生成对抗网络gan loss曲线图
    Dynamic Wallpaper for Mac:动态壁纸让桌面更生动
    数字源表如何测试MOS管?
    企业邮箱 vs. 126邮箱:选择与比较
  • 原文地址:https://blog.csdn.net/qq_26641137/article/details/136694399