概述
单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中的一个类只产生一个实例。
在面试中经常会遇到,手写一种单例模式实现方式,而单例的实现方式有:懒汉式、饿汉式、线程安全式、双重检查式和静态内部类方式,为了便于学习记忆记录一下。
懒汉式
需要时创建一个实例,所以第一个是线程不安全的
public class LazySingleton {
private static LazySingleton mLazySingleton;
private LazySingleton(){}//无参构造
public static LazySingleton getmLazySingleton(){
//没有实例,创建一个
if(mLazySingleton == null) {
mLazySingleton = new LazySingleton();
}
return mLazySingleton;
}
}
线程安全式
这个方式中同步了整个SafeSingleton.getmSafeSingleton方法,保证了线程安全
public class SafeSingleton {
private static SafeSingleton mSafeSingleton;
private SafeSingleton(){}//无参构造
public static synchronized SafeSingleton getmSafeSingleton(){
if(mSafeSingleton == null) {
mSafeSingleton = new SafeSingleton();
}
return mSafeSingleton;
}
}
饿汉式
public class EagerSingleton {
private static EagerSingleton mEagerSingleton = new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getmEagerSingleton(){
return mEagerSingleton;
}
}
双重检查式
线程安全式同步整个获取单例的方法会浪费很多性能,双重检查式区别在初次创建时才会同步
public class DoubleCheckSingleton {
private static DoubleCheckSingleton mDoubleCheckSingleton;
private DoubleCheckSingleton(){}
public static DoubleCheckSingleton getmDoubleCheckSingleton(){
if(mDoubleCheckSingleton != null){//第一次检验是否创建了单例
synchronized (DoubleCheckSingleton.class){
if (mDoubleCheckSingleton != null){//第二次检验是否创建了单例
mDoubleCheckSingleton = new DoubleCheckSingleton();
}
}
}
return mDoubleCheckSingleton;
}
}
静态内部类
public class StaticSingleton {
private StaticSingleton(){}
private static class StaticSingletonHolder{
private static final StaticSingleton mStaticSingleton = new StaticSingleton();
}
public static final StaticSingleton getInstance(){
return StaticSingletonHolder.mStaticSingleton;
}
}