美文网首页
Android源码中的一种单例实现

Android源码中的一种单例实现

作者: listen2code | 来源:发表于2017-01-12 01:14 被阅读520次

单例模式的实现方式有懒汉,饿汉,双重校验锁,枚举,内部类等等,写法就不全部列举了。Android源码中有一个单例辅助类/frameworks/base/core/java/android/util/Singleton.java,可以实现懒汉式单例,写法挺奇特的,虽然是个hide类,不过拷贝出来就可以用了。

package android.util;

/**
 * Singleton helper class for lazily initialization.
 *
 * Modeled after frameworks/base/include/utils/Singleton.h
 *
 * @hide
 */
public abstract class Singleton<T> {
    private T mInstance;

    protected abstract T create();

    public final T get() {
        synchronized (this) {
            if (mInstance == null) {
                mInstance = create();
            }
            return mInstance;
        }
    }
} 
    

正常懒汉单例

public class SingletonDemo {
    private static SingletonDemo mInstance;

    public static final SingletonDemo get() {
        synchronized (SingletonDemo.class) {
            if (mInstance == null) {
                mInstance = new SingletonDemo();
            }
            return mInstance;
        }
    }
} 

懒汉+双重校验单例

public class SingletonDemo {
    private static SingletonDemo mInstance;

    public static final SingletonDemo get() {
        if (mInstance == null) {
            synchronized (SingletonDemo.class) {
                if (mInstance == null) {
                    mInstance = new SingletonDemo();
                }
            }
        }
        return mInstance;
    }
} 

变种懒汉单例

public class SingletonDemo {

    public static final SingletonDemo get() {
        return INSTANCE.get();
    }

    private static final Singleton<SingletonDemo> INSTANCE = new Singleton<SingletonDemo>() {
        protected SingletonDemo create() {
            return new SingletonDemo();
        }
    };
}

懒汉式单例一般都会再加个双重校验的判断,避免每次调用get()都加锁,影响性能,Android源码中Singleton.java工具类并没有做双重校验(看了下googlesource中的Singleton.java,也是6年前提交的代码了),所以我们在将Singleton.java拷贝出来使用的时候可以加个双重校验优化下。Singleton.java封装了create,get模版,及get中的校验逻辑,从而SingletonDemo中的实现代码就可以更加的简单:1.create()一个单例对象,2.在需要的时候get()。

相关文章

  • 单例模式(二)

    单例模式在Android源码中的应用 除了之前说的几种单例的实现方式之外还可以使用容器来实现。 在Android的...

  • 简单聊聊单例模式

    单例模式应该是Android开发中常用的一种设计模式。不仅我们经常用到,Android源码中也经常可以看到单例模式...

  • LayoutInflater源码分析

    在《(-)Android中的单例模式》分析中,我们分析了Android中单例模式的实现,且以LayoutInfla...

  • 单例模式(Java内部类加载顺序)

    你真的会写单例模式吗——Java实现Android设计模式源码解析之单例模式深度分析 Java 的枚举类型:枚举的...

  • Android源码中的一种单例实现

    单例模式的实现方式有懒汉,饿汉,双重校验锁,枚举,内部类等等,写法就不全部列举了。Android源码中有一个单例辅...

  • 单例模式 DCL(Double Check Lock)的问题

    摘抄《Android源码设计与实例》 DCL 实现单例: 问题: 关键在于instance = new Singl...

  • java单例的另一种写法

    java单例的另一种写法 阅读android源码时发现ActivityManager有一个单例的写法如下: Sin...

  • Android 中的 23 种设计模式

    系列笔记 通过学习 Android 的设计模式而记的笔记。(持续更新中...) 源码地址 Android 单例模式...

  • 设计模式:单例

    单例模式的基本介绍单例模式的实现源码中的单例模式记录 单例模式的基本介绍 定义:确保一个类只有一个实例,自行实例化...

  • 枚举单例

    描述 本文先反编译枚举,再使用枚举实现单例 枚举 单例 单例源码 单例反编译 引用 http://www.benf...

网友评论

      本文标题:Android源码中的一种单例实现

      本文链接:https://www.haomeiwen.com/subject/hocdbttx.html