java|java volatile应用场景
【java|java volatile应用场景】volatile的知识回顾:
- 写入:写入变量的时候,直接写到主内存,并且失效其他线程的本地内存;
- 读取:读取的时候,直接读取的主内存或者未失效的本地内存;
以上描述不精确,但主要思路是OK的,思路与缓存设计异曲同工
- 一写多读场景
这种场景不需要考虑两个线程同时写变量导致变量不正确,但是需要考虑实时性;
这种情况一般是做信号使用,如果不用volatile标识变量,那么线程A写、更新了变量后,其余的B/C/D/E....线程,不保证合适能够读到最新的值,但是加了volatile后,能保证读到的一定是最新值,保证了信号传递的效率;
我们来看一个典型的乐观锁(伪代码,不能运行,这种操作一般都是调用Unsafe类来操作,原子性操作请使用java.util.concurrent.atomic,不用自己写乐观锁)
public class VolatileTest {
private volatile int a = 0;
public static void main(String[] args){
int expect ;
do{
expect = a;
}while (!compareAndSet(expect, expect+1));
}
}
可想而知,如果没有
volatile
来标识a变量,那么expect = a;
这行读到最新的值要花费更多的时间,而乐观锁是一直空转了,就会多N次空转,白白浪费了大好的CPU资源volatile
在乐观锁场景意义重大推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)