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屏障

在这里插入图片描述

相关推荐

  1. volatile关键字

    2024-03-17 14:34:02       32 阅读
  2. volatile关键字

    2024-03-17 14:34:02       35 阅读
  3. volatile关键字详解

    2024-03-17 14:34:02       58 阅读
  4. 并发编程--Volatile关键字

    2024-03-17 14:34:02       47 阅读
  5. 介绍下volatile关键字

    2024-03-17 14:34:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 14:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 14:34:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 14:34:02       82 阅读
  4. Python语言-面向对象

    2024-03-17 14:34:02       91 阅读

热门阅读

  1. Android启动优化

    2024-03-17 14:34:02       35 阅读
  2. 蓝桥杯构造法|两道例题(C++)

    2024-03-17 14:34:02       41 阅读
  3. 《工厂模式(极简c++)》

    2024-03-17 14:34:02       42 阅读
  4. SpringMVC启动与请求处理流程解析

    2024-03-17 14:34:02       44 阅读
  5. 使用Go Validator在Go应用中有效验证数据

    2024-03-17 14:34:02       48 阅读
  6. PyTorch学习笔记之基础函数篇(十四)

    2024-03-17 14:34:02       41 阅读
  7. leetcode电话号码的字母组合

    2024-03-17 14:34:02       48 阅读
  8. C语言——母牛的故事

    2024-03-17 14:34:02       41 阅读