首页 > 编程 > Java > 正文

简单了解java volatile关键字实现的原理

2019-11-26 08:43:03
字体:
来源:转载
供稿:网友

一、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不会引起阻塞。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表