单例模式的原理:
有些对象我们只需要一个,比如线程池,缓存,硬件设备等。如果多个实例会有造成冲突,结果不一致性等问题。单例模式确保一个类最多有一个实例,并提供一个全局访问点。
五种经典的单例模式
1,饿汉模式
这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
2,懒汉模式
声明了一个静态对象,在用户第一次调用时初始化。这种写法能够在多线程中很好地工作,每次都需要同步。
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
3,双重检查模式
这种写法在getinstance方法中对singleton进行了两次判空:第一次是为了减少不必要的同步,第二次是在singleton为空的时候才创建实例。
public class Singleton{
private static volatile Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
synchornized(singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
4,静态内部类单例模式
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sInstance();
}
private static class SingleHolder{
private static final Singleton sInstance=new Singleton();
}
}
5,枚举单例模式
public enum Singleton{
INSTANCE;
public void doSomeThing(){
}
}