简单了解java volatile关键字实现的原理
一、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不会引起阻塞。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
为什么Spring官方推荐的@Transational还能导致生产事故
在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,那么为什么Spring官方推荐的@Transational还能导致生产事故,本文就详细的介绍一下2021-11-11Android中PreferenceFragment的使用详解
本文主要介绍了Android中PreferenceFragment的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-09-09
最新评论