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就是保持内存可见性!保证每次数据都从内存读取

相关文章
|
6月前
|
存储 Java 开发者
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
72 1
|
6月前
|
存储 缓存 安全
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
50 1
|
存储 C++
[自考]C++中一些特殊用法
[自考]C++中一些特殊用法
77 0
|
前端开发 JavaScript C语言
带你读书之“红宝书”:第十章 函数①
带你读书之“红宝书”:第十章 函数①
100 0
带你读书之“红宝书”:第十章 函数①
|
Java
这篇 ReentrantLock 看不懂,加我我给你发红包(三)
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
138 1
这篇 ReentrantLock 看不懂,加我我给你发红包(三)
笔者记不住的一些注意事项和一些操作符的运用与君分享(基础C)
笔者记不住的一些注意事项和一些操作符的运用与君分享(基础C)
笔者记不住的一些注意事项和一些操作符的运用与君分享(基础C)
|
前端开发 JavaScript C语言
带你读书之“红宝书”:第十章 函数⑤
带你读书之“红宝书”:第十章 函数⑤
68 0
带你读书之“红宝书”:第十章 函数⑤
|
Java 调度
这篇 ReentrantLock 看不懂,加我我给你发红包(二)
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
100 0
这篇 ReentrantLock 看不懂,加我我给你发红包(二)
|
Java 调度
这篇 ReentrantLock 看不懂,加我我给你发红包(一)
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
84 0
这篇 ReentrantLock 看不懂,加我我给你发红包(一)
|
存储 算法 编译器
深剖关键字(跑路人笔记2)
深剖关键字(跑路人笔记)
深剖关键字(跑路人笔记2)