volatile关键字的实现原理

本文深入解析了volatile关键字的语义,包括其可见性和有序性保证,并详细解释了volatile的实现机制。通过具体示例展示了volatile在状态标志和双重检查锁定等场景的应用。最后对比了volatile与synchronized的区别。

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

一、volatile关键字的语义分析

  1.保证可见性

    对共享变量的修改,其他线程能够马上感知到。但不能保证原子性(i++)

  2.保证有序性

  3.volatile的原理和实现机制

    有volatile修饰的共享变量进行写操作的时候会多出有 “lock”标志的汇编代码,Lock前缀的指令在多核处理器下会引发两件事情:

     1)将当前处理器缓存行中的数据写回到系统内存中

    2)这个写回内存的操作会使在其他cpu里缓存了该内存地址的数据无效。

二、volatile的使用场景

  1.状态标志(开关模式)

  

package com.roy.http;

public class ShutDownDemmo extends Thread{
	private volatile boolean state = false;
	@Override
	public void run() {
		while(state){
			System.out.println("我在做工作");
		}
	}
	public void shutDown(){
		state = false;
	}
	
}

  当调用shutDown方法时,里面只有一个赋值操作,所以它是原子性的,同时state字段是volatile的,所以当值发生变化时其它线程会立即察觉到。

  2.双重检查锁定(double-checked-locking)

package com.roy.http;

public class Singleton {
	private volatile static Singleton instance;
	public static Singleton getInstance(){
		if (instance==null) {
			synchronized (Singleton.class) {
				instance = new Singleton();
			}
		}
		return instance;
	}
}

  单例模式中使用双重检查锁定。

四、volatile和synchronized的区别

  1.使用上的区别

    volatile只能修饰变量,而synchronized只能修饰方法和语句块。

  2.对原子性的保证

    volatile不能保证原子性,synchronized保证了原子性。

  3.对可见性的保证

    两者都能保证可见性,但实现原理不同

    volatile对变量添加了lock,synchronized使用monitorenter和monitorexit。

  4.对有序性的保证

    volatile能保证有序,synchronized也能保证有序,但是代价大

  5.其他

    synchronized会引起阻塞,volatile不会引起阻塞。

转载于:https://www.cnblogs.com/yongan/p/10596706.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值