6.终于了解volatile的原理和使用方法了

news/2024/11/20 19:42:28/

1.volatile能保证可见性

先说个案例:

  • 有两个线程A和B,有一个公共的 boolean flag 标记位,最开始赋值为 true;
  • B线程循环,根据这个flag来进行执行或者退出;
  • 这时线程A把flag改成false这个时候希望线程B看到变化,而停止执行;
  • 但是线程B可能并不能立刻停下来,也有可能过一段时间才会停止,甚至在最极端的情况下可能永远都不会停止。
  • 因为最开始它们都可以读取到 flag 为 true ,不过当线程 A 这个值改为 false 之后,线程B 并不能及时看到这次修改,因为线程B 不能直接访问线程A 的本地内存。

可以看一下CPU的内存结构:
在这里插入图片描述
可以看出,线程A和线程B 分别在不同的 CPU 核心上运行,每一个核心都有自己的本地内存,并且在下方也有它们共享的内存。

这样的问题就是一个可见性问题。

volatile 关键字:

要想解决这个问题,我们只需要在变量的前面加上 volatile 关键字修饰,只要我们加上这个关键字,那么每一次变量被修改的时候,其他线程对此都可见,这样一旦线程A改变了这个值,那么线程B 就可以立刻看到,因此就可以退出 while 循环了。

所以volatile关键字可以让它拥有可见性。

原因在于有了这个关键字之后,线程 A 的更改会被 flush 到共享内存中,然后又会被 refresh 到线程B 的本地内存中,这样线程B 就能感受到这个变化了,所以 volatile 这个关键字最主要是用来解决可见性问题的,可以一定程度上保证线程安全。

2.volatile 不能保证原子性

  • 比如我们线程A和B 同时进行 value++ ;
  • 每个线程都加 1000 次,最终的结果很可能不是 2000;
  • 所以在多线程的情况下,会出现线程安全问题(不信可以自己试一下);
  • 因为这里的问题不单单是可见性问题,还包含原子性问题。

如果我们想保证原子性也有很多办法比如:

  • 使用 synchronized 关键字
  • 使用我们的原子类 AtomicInteger ,调用它的 incrementAndGet 方法
    • 在利用了原子变量之后就无需加锁,我们可以使用它的 incrementAndGet 方法,这个操作底层由 CPU 指令保证原子性,所以即便是多个线程同时运行,也不会发生线程安全问题。

3.volatile 使用场景

通常情况下,volatile 可以用来修饰 boolean 类型的标记位,因为对于标记位来讲,直接的赋值操作本身就是具备原子性的,再加上 volatile 保证了可见性,那么就是线程安全的了。

也就是说我们有一个可见性问题,那么可以使用 volatile 关键字。

如果我们要保证原子性可以使用 原子类 来保证。可以自己探索下,后面我也会总结的,

OK完活。


http://www.ppmy.cn/news/744.html

相关文章

Android Profiler入门与实践

1、内存分析 点击MEMORY,可以看到正在运行进程的各种内存使用情况 Tips:点击右上角的垃圾桶图标会触发强制gc 1.1、查看Java堆内存和Java实例 执行以下代码: 说明:list为MainActivity的全局变量,所以list的只有在M…

Oracle面试题整理

目录 Oracle面试题整理 1.MySQL和Oracle的区别: 2.Oracle中function和procedure的区别? 3. 比较truncate和delete命令 ? 4.oralce中 rowid, rownum的定义 5. 事务的特性(ACID)是指什么 6. 列举几种表连接方式…

微机----------LED显示接口

目录 LED显示器的工作原理采用专用芯片进行LED段译码软件译码法静态显示与动态显示LED显示器的工作原理 LED显示器的主要部分是七段发光管,这七段发光段分别称为a、b、c、d、e、f、g有的产品还附带有一个小数点DP。通过7个发光段的组合,可以显示0 ~ 9 和 A ~ F共16个字母数字…

使用azure-data factory

data-fatory介绍 Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS。ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-free UI&…

(论文阅读笔记)Network planning with deep reinforcement learning

[1] ZHU, Hang, et al. Network planning with deep reinforcement learning. In: Proceedings of the 2021 ACM SIGCOMM 2021 Conference. 2021. p. 258-271. Citation: 25文章目录Q1 论文试图解决什么问题?Q2 这是否是一个新的问题?Q4 有哪些相关研究&…

一个分布在多次Softmax后,会趋于相同

本文其实是我在知乎上无意中翻到的一条提问:softmax到底有哪些作用?,其中苏剑林大佬关于第四个问题的回复,给我产生了一些思考。为什么一个分布在多次Softmax之后,每个值会趋于相同?例如[1,100]在大约10次S…

LeetCode-50-Pow(x, n)

1、递归 我们最简单的思路就是使用递归,每次就让x乘上Pow(x, n-1)的值。但是这样做的缺点在于递归时间过长会导致超时,因此我们可以使用快速幂进行优化。 快速幂的思想在于我们在求x的N次幂时,不使用x∗xN−1x*x^{N-1}x∗xN−1,…

我们真的需要把训练集的损失降到零吗?

在训练模型的时候,我们需要将损失函数一直训练到0吗?显然不用。一般来说,我们是用训练集来训练模型,但希望的是验证机的损失越小越好,而正常来说训练集的损失降到一定值后,验证集的损失就会开始上升&#x…