饿汉式
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getSingleton(){
return singleton;
}
}
优点:编写简单
缺点:无法延迟加载
单线程写法
public class Singleton {
private static Singleton singleton = null;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton == null)
singleton = new Singleton();
return singleton;
}
}
优点:编写简单
缺点:多线程市不安全
线程安全的写法
public class Singleton {
private static Singleton singleton = null;
private Singleton(){}
public static Singleton getSingleton(){
synchronized (Singleton.class){
if(singleton == null)
singleton = new Singleton();
}
return singleton;
}
}
优点: 线程安全
缺点:效率不高,每次都需要排队等待(单例中是恨到new的,所以每次来都需要排队)
线程安全兼效率的写法 又叫 双重检查锁
public class Singleton {
private static Singleton singleton = null;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null)
singleton = new Singleton();
}
}
return singleton;
}
}
优点:提升了并发度,进而提升了性能
静态内部类法
public class Singleton {
private Singleton(){}
private static class Holder{
private static Singleton singleton = new Singleton();
}
public static Singleton getSingleton(){
return Holder.singleton;
}
}
优点:线程安全的(静态内部类只会被加载一次)