单例模式在多线程环境下需要double check。
我们来看不double check的情况
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
System.out.println("单例生成");
}
public static Singleton getInstance() {
if (singleton == null) {
// synchronized(Singleton.class) {
// if(singleton == null) {
singleton = new Singleton();
// }
// }
}
return singleton;
}
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Singleton s = Singleton.getInstance();
}
}).start();
}
}
}
我们看注释了四条语句
结果如下图:
单例生成: 结果生成三个实例。
但是如果把四行注释去掉, 就会只有一个单例生成。