1.饿汉式
/** * 饿汉模式 * <p> * 缺点: * 在类加载的时候就进行了实例化,浪费内存 * 优点: * 在获取实例的时候已经创建好了实例 * @author ZhangRui * @time 2018/5/25 20:28 */ public class HungrySingleton { private static final HungrySingleton sInstance = new HungrySingleton(); public static HungrySingleton getInstance() { return sInstance; } }
2.懒汉式
/**
* 懒汉模式
*
* 缺点:
* 在多线程中获取实例的时候会存在阻塞,比较耗时;
* 优点:
* 在需要使用的时候创建实例,避免了不必要的内存浪费
* @author ZhangRui
* @time 2018/5/25 20:31
*/
public class LazySingleton {
private static LazySingleton sInstance;
public synchronized static LazySingleton getInstance() {
if (sInstance == null) {
sInstance = new LazySingleton();
}
return sInstance;
}
}
3.DoubleCheck模式
/** * DoubleCheck 模式 * * 缺点: * 如果不添加volatile关键字的时候,对象实例化不是原子性的操作,调用对象的方法时可能报nullPointException * 优点: * 多线程不会创建多个对象 * * volatile 关键字 禁止java代码重排序,保持随时改变,立即可见性 * @author ZhangRui * @time 2018/5/25 20:36 */ public class DoubleCheckSingleton { private static volatile DoubleCheckSingleton mInstance; public static DoubleCheckSingleton getInstance() { if (mInstance == null) { synchronized (DoubleCheckSingleton.class) { if (mInstance == null) { mInstance = new DoubleCheckSingleton(); } } return mInstance; } return mInstance; } }
4.静态内部类
/**
* 静态内部类模式
*
* 推荐选用这种模式创建单例
* @author ZhangRui
* @time 2018/5/25 21:04
*/
public class StaticInnerClassSingleton {
public static class Holder{
private static StaticInnerClassSingleton mInstance = new StaticInnerClassSingleton();
public static StaticInnerClassSingleton getInstance(){
return mInstance;
}
}
}