Volatile 关键字语义分析
- volatile作用:让其他线程能够马上感知到某一线程多某个变量的修改
(1)保证可见性
对共享变量的修改,其他的线程马上能感知到
不能保证原子性 读、写、(i++)
(2)保证有序性
重排序(编译阶段、指令优化阶段)
输入程序的代码顺序并不是实际执行的顺序
重排序后对单线程没有影响,对多线程有影响
Volatile
Happens-before
volatile规则:
对于volatile修饰的变量:
(1)volatile之前的代码不能调整到他的后面
(2)volatile之后的代码不能调整到他的前面(as if seria)
volatile的原理和实现机制(锁、轻量级)
- 声明 Volatile int a ;
- 汇编变为:Lock :a,遵循java对于CPU的开发规范 Lock是CPU开放的接口
使用场景
public class StateOpenOrClose implements Runnable{
private boolean switchKey = true;
@Override
public void run() {
while(switchKey) {
doWork();
}
}
private void doWork() {
System.out.println("Working");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutdown() {
switchKey = false;
}
public static void main(String[] args) {
StateOpenOrClose stateOpenOrClose = new StateOpenOrClose();
new Thread(stateOpenOrClose).start();
new Thread(() ->{
try {
TimeUnit.SECONDS.sleep(5);
stateOpenOrClose.shutdown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
public class Singleton {
private volatile static Singleton instance = null;
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
- volatile和synchronized区别
- volatile只能修饰变量,synchronized可修饰方法,语句块,
- synchronized 可保证原子性,volatile无法保证原子性
- synchronized和volatile 都可保证可见性,但实现原理不同
+ volatile是对变量加了 Lock,synchronized使用的是monitorentry和monitorexit - volatile保证有序性,synchronized 可保证有序性,但代价太大,只有到达重量级锁才会保证有序性,因为退化为了串行执行(引起了阻塞)