Volatile理解

本文详细解析了Java中的Volatile关键字的工作原理及其应用场景。介绍了Volatile如何通过内存屏障和禁止重排序来确保可见性和有序性,并强调了它不保证原子性的特点。最后通过双重校验锁的示例展示了Volatile的正确使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Volatile理解

Volatile 通过加入内存屏障和禁止重排序优化来实现

1、对volatile变量写操作时,会在写操作后加入一条store屏障命令,将本地内存中的共享变量值刷新到主内存

2、对volatile变量读操作时,会在读操作前加入一条load屏障命令,从主内存中读取共享变量

3、happens-before原则其中之--- volatile变量原则:对一个变量的写操作先行发生与后面对这个变量的读操作

 

示意图:

 

应用场景

1、错误场景:

使用volatile 修饰一个计数变量如 privat volatile static int count = 0; 企图通过volatile来实现count++;操作。

count++操做可分解为三步:读到count值,count+1,count写入内存。即volatile不具备原子性

如果多个线程同时读到count,执行了加1操作,再写入,就会出现并发问题。

 

2、典型应用场景:

应用前题是,对变量的写操作,不依赖当前值。

适合作为状态标记量:

另一种使用场景:双重校验锁

/*
 * 双重校验锁
 */
public class SingletonClass2 {
	
	private static volatile SingletonClass2  instance;//声明成 volatile
	
	private SingletonClass2(){
		
	}
	
	public static SingletonClass2 getInstance(){
		if(instance == null){
			synchronized (SingletonClass2.class) {
				if(instance == null){
					instance = new SingletonClass2();
				}
			}
		}
		return instance;
	}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值