单例模式的实现方式有懒汉,饿汉,双重校验锁,枚举,内部类等等,写法就不全部列举了。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 {

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 INSTANCE = new Singleton() {

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源码中的一种单例实现相关推荐

  1. 单光感pid巡线_乐高4种单光感巡线逻辑

    乐高机器人4种单光感巡线逻辑.巡线话题应该不会过时,之前看过晓舟的巡线专题教程http://bbs.cmnxt.com/thread-3074-1-1.html以及伯虎关于PID巡线的帖子,受益颇多, ...

  2. Android源码分析(十一)-----Android源码中如何引用aar文件

    一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...

  3. android源码中的ndk,如何在不需要Android操作系统源代码的情况下在Android NDK中创建新的NativeWindow?...

    我想编译一个Android OpenGL控制台应用程序,您可以直接从控制台启动Android x86或从Android x86 GUI中的Android终端应用程序运行.如何在不需要Android操作 ...

  4. Android中SQLiteDatabase操作【附源码】

    像我们做的很多应用程序及网站一样,基本都是对数据库进行增删改查来实现相应的功能.那么Android开发也一样,不过由于在移动客户端应用,所以不会像sql server.mysql那么复杂,Androi ...

  5. android eclipse关联源码,在源码中编译自己的 Android project(eclipse编译的工程加到源码中)...

    1)将在Eclipse (当然也可以用记事本编写)中编写好的纯源代码(src+res+AndroidManifest.xml )拷到Android 源代码文件夹下的packages/apps 文件夹中 ...

  6. android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)

    在上篇文章: warmcheng:Android生命周期组件 Lifecycle 使用详解​zhuanlan.zhihu.com 中,我们讲了 Lifecycle 的简单使用,本篇我们来研究下它的源码 ...

  7. Android应用进程间通信之Messenger信使使用及源码浅析,Android插件化入门指南

    } } break; default: super.handleMessage(msg); break; } } } } 工程中的一个独立进程客户端client代码: public class Mai ...

  8. Android应用进程间通信之Messenger信使使用及源码浅析

    转载: http://blog.csdn.net/yanbober 1 背景 这个知识点是个low货,刚开始其实想在之前一篇文章<Android异步消息处理机制详解及源码分析>一文中作为一 ...

  9. 【Android】Java回调原理并结合Android源码进行理解

    回调机制是一种常见的设计模式,它把工作流内的某个功能按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据. 之前对于回调一直是一知半解,而且总是停留在C++的函数指针的理解之 ...

最新文章

  1. shell脚本示例:批量比较多个文件的内容是否相同
  2. libtorch Tensor cannot be used as a tuple
  3. cmd变量,参数,for循环,
  4. 不让复制是不可能的----js获取选中文字
  5. “假冒hao123”“北大青鸟”被黑 钓鱼挂马两不误
  6. Cannot assign to read only property 'exports' of object '#Object'
  7. 大学计算机课思维导图,快速记忆和理解大学计算机思维导图
  8. 考察交互的方差分析与简单效应分析(附带操作数据)
  9. 人生的第一篇博客φ(>ω<*)
  10. 使用 VS 打开 VC++6.0 创建的 MFC 项目
  11. nginx proxy_pass 502 这是什么错误?
  12. Xilinx zynqmp VCU使用
  13. Ubuntu16.04系统迁移SSD
  14. vue 修改地址栏参数
  15. codeforces 869C The Intriguing Obsession【组合数学+dp+第二类斯特林公式】
  16. 【完美解决:绝对路径含中文问题】bat一键启动应用绝对路径中含中文导致无法执行
  17. 英语语法:词法之非谓语动词--起式
  18. 【C语言】数组(一维数组、二维数组)
  19. 自由曲面光学元件的OAM测量
  20. 华中科技大学计算机学院郑强教授简历,华中科大教授声讨后勤被处分 郑强个人简介介绍...

热门文章

  1. raspberry pi_如何启动新的Raspberry Pi
  2. 开放接口加密方案_27种开放式解决方案,适用于所有教育
  3. Jono Bacon的社区管理指南
  4. Vue组件间常用的通信方式总结
  5. 使用函数处理数组 高阶函数 js
  6. CSS两栏布局之右栏布局
  7. java wav合并_用Java串联WAV文件
  8. python post提交给php,从Python发送HTTP POST请求(尝试从PHP转换)
  9. 类的别名java,类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:typeAliases typeAlias ali...
  10. glide加载图片闪烁_html5 canvas绘制图片