volatile关键字——摸鱼の随笔

简介: 关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。

关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。


volatile作用🤔

在一般程序运行时,运算一般会交给 CPU 处理,CPU存在运算和控制两个作用,而运算又分为逻辑运算和算术运算。实际场景使用判断时比如 while 语句的条件,就会交给 CPU 逻辑判断,是真返回1继续是真返回1再继续,而 CPU 会默认对数据进行优化,所谓的优化实质上是一种“内存覆盖”,防止优化。

image.png

为了判断时不用去代码中读取,CPU 会每次直接从寄存器里面的读取条件,从代码层面讲其实 CPU 根本就没有再去读取数据,在汇编层面上CPU会自己跳转自己。


但是一但涉及出现另一个逻辑改变了 while 里面条件的值(多线程逻辑是并行的),此时 CPU 依然会在寄存器里面拿到原来条件的值,导致结果异常。volatile 就是防止这种情况进行一个内存的覆盖。


应用场景🤔

以Linux为例:

image.png

分析一下汇编代码


mov:将 pass 放入 exa


test:测试,这里是自己与自己测试(按位与,按位或等)


jne:jump not equals zero,测试结果不为0跳转到相关地址40040d


jmp:跳转到40040d(这里就是自己跳转到自己)


总结一下,volatile就是保持内存可见性!保证每次数据都从内存读取

相关文章
|
3月前
|
存储 缓存 安全
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
39 1
|
Java
关于关键字volatile的一二
关于关键字volatile的一二
63 0
|
Java
这篇 ReentrantLock 看不懂,加我我给你发红包(三)
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
124 1
这篇 ReentrantLock 看不懂,加我我给你发红包(三)
|
Java 调度
这篇 ReentrantLock 看不懂,加我我给你发红包(二)
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
88 0
这篇 ReentrantLock 看不懂,加我我给你发红包(二)
|
Java 调度
这篇 ReentrantLock 看不懂,加我我给你发红包(一)
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
78 0
这篇 ReentrantLock 看不懂,加我我给你发红包(一)
|
存储 算法 编译器
深剖关键字(跑路人笔记2)
深剖关键字(跑路人笔记)
深剖关键字(跑路人笔记2)
深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?
深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?
深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?
|
存储 前端开发 对象存储
前端百题斩【011】——通俗易懂的变量对象
前端百题斩【011】——通俗易懂的变量对象
前端百题斩【011】——通俗易懂的变量对象
|
存储 缓存 NoSQL
当Synchronized遇到这玩意儿,有个大坑,要注意! (中)
当Synchronized遇到这玩意儿,有个大坑,要注意! (中)
138 0
当Synchronized遇到这玩意儿,有个大坑,要注意! (中)
|
缓存 Oracle Java
当Synchronized遇到这玩意儿,有个大坑,要注意! (下)
当Synchronized遇到这玩意儿,有个大坑,要注意! (下)
119 0
当Synchronized遇到这玩意儿,有个大坑,要注意! (下)