饿汉式
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton(){
}
public Singleton getSingleton(){
return INSTANCE;
}
}
上面的代码虽然满足需求,但是不管有没有用到这个类,这个类都会被初始化
懒汉式
public class Singleton {
private static Singleton singleton;
private Singleton(){
}
public Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
上面这个代码,只有用到的时候才会去初始化,但是多线程的话,还是有可能会new多个实例
双重检查
public class Singleton {
private static Singleton singleton;
private Singleton(){
}
public Singleton getSingleton(){
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
其他方式
静态内部类
public class Singleton {
private Singleton(){
}
public Singleton getSingleton(){
return innerSingleton.INSTANCE;
}
private static class innerSingleton{
private static final Singleton INSTANCE = new Singleton();
}
}
静态内部类在Singleton类加载时不会初始化,只有调用getSingleton()的时候才会初始化
枚举方式
public enum Singleton {
INSTANCE;
}
但是不太推荐这种使用方式