实现单例模式,有3个要点:
- 某个类只能有一个实例;
- 这个实例只能本类自己创建;
- 创建的这个实例必须向整个系统开放。
为了满足这3个要点,单例模式必须:
- 在本类中实例化;
- 构造器必须私有,外界不能通过调用构造器创建对象;
- 必须对外提供一个静态的方法供外界获取该类的实例。
简单的一个单例模式:双重检查 + synchronized关键字 + volitle关键字如下:
public class Singleton {
private static volatile Singleton singleton = null;
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
这里面有3个关键点:
1. 用到了关键字volatile;
2. 用到了关键字synchronized;
3. 用到了双重检查if (singleton == null)
来来来,我们给这个单例模式加点料,来分析下,注意在 #0 中,去掉了 volatile:
package com.example;
public class Singleton {
// 去掉了volatile关键字
private static Singleton singleton = null; //#0
public static int