单例模式
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
/**
* 单例中的饿汉式
*/
class Single {
private static Single single = new Single();
private Single() {
}
public static Single getInstance() {
return single;
}
}
/**
* 懒汉式
*/
class Single2 {
private volatile static Single2 single2;
private Single2() {
}
public static Single2 getInstance() {
if (single2 == null) {
synchronized (Single2.class) {
if (single2 == null) {
single2 = new Single2();
}
}
}
return single2;
}
正确的双重检查锁定模式需要需要使用volatile。volatile主要包含两个功能。
- 保证可见性。使用volatile 定义的变量,将会保证对所有线程的可见性。
- 禁止指令重排序优化。
由于volatile 禁止对象创建时指令之间重排序,所以其他线程不会访问到一个未初始化的对象,从而保证
安全性。