Updated on 2016-11-19
饿汉方式
实例在 加载时 就创建。
public class A {
private static final A Instance = new A();
private A() { 私有构造方法
}
public static A getInstance() {
return Instance;
}
}
懒汉方式
实例在 使用时 才创建。
public class A { 双重校验锁
private static volatile A Instance; 禁止指令重排并保证可见性
private A() { 私有构造方法
}
public static A getInstance() {
if (Instance == null) { 第一次检查
synchronized (A.class) {
if (Instance == null) { 第二次检查(防止多个进程因同时判断实例为 null,而进入同步块,而再次实例化)
Instance = new A();
}
}
}
return Instance;
}
}
public class A { 静态内部类
private A() { 私有构造方法
}
public static A getInstance() {
return InstanceHolder.Instance; 由 JVM 类加载机制来保证单例
}
private static class InstanceHolder { 静态内部类为饿汉方式
private static final A Instance = new A();
}
}
public static void main(String[] args) {
IntStream.range(0, 2000).forEach(o -> new Thread(() -> System.out.println(A.getInstance().hashCode())).start());
or
Stream.generate(() -> new Thread(() -> System.out.println(A.getInstance().hashCode()))).limit(2000).forEach(Thread::start);
}