第一种:懒汉式,线程不安全
public class Singleton {
private static Singleton instance;
private Singleton ( ) { }
public static Singleton getInstance ( ) {
if ( instance == null ) {
instance = new Singleton ( ) ;
}
return instance;
}
}
1. 多线程不能正常工作;
2. 严格意义上不算单例模式。
第二种:懒汉式,线程安全
public class Singleton {
private static Singleton instance;
private Singleton ( ) { }
public static synchronized Singleton getInstance ( ) {
if ( instance == null ) {
instance = new Singleton ( ) ;
}
return instance;
}
}
1. 多线程能正常工作;
2. 加锁效率很低。
第三种:饿汉式
public class Singleton {
private static Singleton instance = new Singleton ( ) ;
private Singleton ( ) { }
public static Singleton getInstance ( ) {
return instance;
}
}
1. 类加载就实例化,浪费内存,容易产生垃圾对象;
2. 没有加锁,效率会提高。
第四种:双检锁/双重校验锁(DCL,即 double-checked locking)
public class Singleton {
private volatile static Singleton singleton;
private Singleton ( ) { }
public static Singleton getSingleton ( ) {
if ( singleton == null ) {
synchronized ( Singleton. class ) {
if ( singleton == null ) {
singleton = new Singleton ( ) ;
}
}
}
return singleton;
}
}
1. 采用双锁机制,多线程时也能保持很高的性能。
第五种:登记式/静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton ( ) ;
}
private Singleton ( ) { }
public static final Singleton getInstance ( ) {
return SingletonHolder. INSTANCE ;
}
}
1. 能达到双检锁方式一样的功效,但实现更简单;
2. 能达到延迟加载的效果。