简介
volatile 关键字 除了防止 JVM 的指令重排 ,还有一个重要的作用就是保证变量的可见性。
主要用于解决变量在多个线程之间的可见性
JMM内存模型
DCL单例
/**
* DCL单例(Double Check Lock双端检索机制)
* 多线程下用这种
*/
public class SingletonTest5 {
public static volatile SingletonTest5 instance = null;
public static SingletonTest5 getInstance(){
if(instance == null){
sychronized(SingletonTest5.class){
if(instance == null){
instance = new SingletonTest5();
}
}
}
return instance;
}
private SingletonTest5(){
}
}
synchronized 关键字和 volatile 关键字的区别
synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在!
- volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 。
- volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。
- volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。