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<IActivityManager> gDefault = new Singleton<IActivityManager>() {
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<SingletonTest> gDefault = new Singleton<SingletonTest>(){
@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