I. 前言
给变量加上 volatile 关键字的含义
- 保证此变量对所有的线程的可见性,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。[相当于一个共享变量]
- 禁止进行指令重排序。[固定了编译时这条语句的位置]
- 以上属于个人理解,关于volatile关键字详细说明请参看Matrix海子
的这篇博客 https://www.cnblogs.com/dolphin0520/p/3920373.html
II. 代码实现
package singleton;
/**
* 双重检测式
*/
public class SingletonDoubleCheck {
private static volatile SingletonDoubleCheck instance;
private SingletonDoubleCheck(){}
// 对外提供一个静态方法。 仅有在被使用时才创建
// 加入 synchronized 关键字, 解决线程安全问题
public static SingletonDoubleCheck getInstance() {
if (instance == null) {
synchronized (SingletonDoubleCheck.class){
if (instance == null) {
instance = new SingletonDoubleCheck();
}
}
}
return instance;
}
}
III. 优点
- 使用懒加载模式,避免了不用时的内存浪费
- 双if 、volatile 及 synchronized 关键字同时保障了线程的安全性和效率问题
- 实际开发中可用