一、volatile关键字的语义分析 1.保证可见性 对共享变量的修改,其他线程能够马上感知到。但不能保证原子性(i++) 2.保证有序性 3.volatile的原理和实现机制 有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不会引起阻塞。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。