最新消息: 新版网站上线了!!!

简单了解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不会引起阻塞。

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

转载请注明:谷谷点程序 » 简单了解java volatile关键字实现的原理