Android源码中的单例模式android.util.Singleton
16lz
2022-05-27
Android系统源码中的单例模式:
代码路径:/frameworks/base/core/java/android/util/Singleton.java
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; } }}
调用位置之一是Activity工作流程中ActivityManagerNative.getDefault().startActivity,这里的ActivityManagerNative.getDefault返回ActivityManagerService的远程接口,即ActivityManagerProxy接口,具体不做讨论,详见老罗(罗升阳)的博客:
Android系统在新进程中启动自定义服务过程(startService)的原理分析
Android应用程序启动过程源代码分析
ActivityManagerNative.getDefault()源码调用如下:
/** * Retrieve the system's default/global activity manager. */ static public IActivityManager getDefault() { return gDefault.get(); }
private static final Singleton gDefault = new Singleton() { protected IActivityManager create() { IBinder b = ServiceManager.getService("activity"); if (false) { Log.v("ActivityManager", "default service binder = " + b); } IActivityManager am = asInterface(b); if (false) { Log.v("ActivityManager", "default service = " + am); } return am; } };
该单例模式实现方式中的Java设计模式有: 单例模式, 模板方法模式mInstance = create();
再加一个使用示例如下:
public class SingletonTest { private static final Singleton gDefault = new Singleton(){ @Override protected SingletonTest create() { return new SingletonTest(); } }; private SingletonTest(){} public static SingletonTest getInstance(){ return gDefault.get(); }}
该单例模式的实现方式其实是采用了静态内部类.
public class Singleton { private static class Holder { private static Singleton singleton = new Singleton(); } private Singleton(){} public static Singleton getSingleton(){ return Holder.singleton; }}
这种方式利用了类加载机制。既做到了延时加载,并且能保证线程安全,我们可以把Singleton实例放到一个静态内部类中,这样就避免了静态实例在Singleton类加载的时候就创建对象,并且由于静态内部类只会被加载一次,所以这种写法也是线程安全的。
本文参考自:
Java单例模式——并非看起来那么简单
你真的会写单例模式吗——Java实现
你真的会写单例模式吗——Java实现
不当之处,欢迎指正
android交流群:230274309
更多相关文章
- Android(安卓)数字格式化
- Android用开发者模式进行调试时出现的问题及解决方案
- Android使用Fragment嵌套Fragment的模式实现界面滑动
- Android(安卓)AP模式下获取SSID/PASSWORD
- Android(安卓)侦测手势的内部类
- Android(安卓)8.0 Tv 修改以太网ip地址 掩码 网关 DNS及DHCP和静
- Activity为singleTask模式时的生命周期
- Android源码中的单例模式android.util.Singleton
- android donut 飞行模式分析