方法1:很经典的,饿汉模式,也是用得很多的。
public class Singleton1{
//final varible ,thread-safe
private static final Singleton1 instance = new Singleton1();
private Singleton1(){
//避免外部实例化
}
public static Singleton1 getInstance(){
return instance;
}
}
方法2:doule-check 方式
public class Singleton3 {
//volatile,根据happens-before,写在读之前
private volatile static Singleton3 instance;
private Singleton3(){
}
public Singleton3 getInstance(){
if(null == instance){
synchronized(Singleton3.class){
if(null == instance){
instance = new Singleton3();
}
}
}
return instance;
}
}
方式3:静态内部类,延迟加载
public class Singleton4 {
private Singleton4(){}
public static final Singleton4 getInstance(){
return Singleton4.SingletonHandler.INSTANCE;
}
private static class SingletonHandler{
private static final Singleton4 INSTANCE = new Singleton4();
}
}
public enum Singleton5 {
INSTANCE;
}