饿汉式(空间换时间)
public class Singleton {
//加static让getInstance方法调用
private static Singleton single = new Singleton();
//私有化构造函数,防止外部直接new对象
private Singleton() {
}
//对外提供方法获取单例对象
public static Singleton getInstance() {
return single;
}
}
懒汉式(时间换空间)
public class Singleton {
//volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性
private static volatile Singleton singleton = null;
private Singleton() {
}
//双重检查,保证多线程操作安全
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
静态内部类(时间换空间)
public class Singleton {
private Singleton() {
}
private static class Internal {
private static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return Internal.instance;
}
}
对JVM而言,外部类和静态内部类是两个平等的对象,外部类被加载时静态内部类并不需要立即被加载,静态内部类不被加载则不需要进行类初始化,因此单例对象在外部类被加载了以后也不占用内存,起到了懒加载的效果。