Volatile理解

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;
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值