volatile原理和使用场景
Posted 猿必过
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile原理和使用场景相关的知识,希望对你有一定的参考价值。
volatile 关键字只能用于修饰变量,无法用于修饰方法。并且 volatile 只能保证可见性,但不能保证操作的原子性。
在具体编程中体现为:volatile 只能保证基本类型以及一般对象的引用赋值是线程安全的。
volatile工作原理
为什么 volatile 只能保证可见性,不能保证原子性呢?这跟它的工作原理有关。
线程写 volaitle 变量的步骤为:
- 改变线程工作内存中 volatile 变量副本的值
- 将改变后的副本的值从工作内存刷新到主内存
线程读 volatile 变量的步骤为:
- 从主内存读取 volatile 变量的最新值到线程的工作内存中
- 从工作内存中读取 volatile 变量的副本
由于在整个过程没有涉及到锁相关的操作,所以无法保证原子性,但是由于实时刷新了主内存中的变量值,因此任何时刻,不同线程总能看到该变量的最新值,保证了可见性。
volatile使用场景
要在多线程中安全的使用 volatile 变量,必须同时满足:
对变量的设置操作不依赖其当前值
- 不满足举例:number++、count = count + 5
- 满足举例: boolean 变量等
该变量没有包含在具有其他变量的不等式中
- 不满足举例:不变时 low < up
在实际项目中,由于很多情况下都不满意 volatile 的使用条件,所以 volatile 使用的场景并没有 synchronized 广。
以上是关于volatile原理和使用场景的主要内容,如果未能解决你的问题,请参考以下文章
场景代码题:有200个骑手都想要抢这⼀个外卖单子,如何保证只有一个骑手接到单子?