Android 单例模式学习
2020-05-08 本文已影响0人
程序员Android1
和你一起终身学习,这里是程序员 Android
本篇文章主要介绍 Android
开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
一、静态内部类单例模式
二、Android 源码中的静态内部类单例实例
三、Double Check Lock(DCL) 实现单例
三、Double Check Lock(DCL) Android 源码使用举例
一、静态内部类单例模式
优点:
不仅能保证线程安全,也能够保证单例对象的唯一性,同时也延迟了单例的实例化。
参考代码如下:
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.sInstance;
}
/**
* 静态内部类 单例模式
*
* 不仅能保证线程安全,也能够保证单例对象的唯一性,同时也延迟了单例的实例化。
* */
private static class SingletonHolder {
private static final Singleton sInstance = new Singleton();
}
}
二、Android 源码中的静态内部类单例实例
暂未找到,后续发现在更新。
三、Double Check Lock(DCL) 实现单例
优点:
1.在需要时才初始化单例
2.保证线程安全
3.对象初始化后调用getInstance 不进行同步锁
参考代码如下:
public class SingletonDCL {
/**
* Double Check Lock
*
* 优点:
*
* 1.在需要时才初始化单例
*
* 2.保证线程安全
*
* 3.对象初始化后调用getInstance 不进行同步锁
* **/
private static SingletonDCL sInstance = null;
public void SingletonDCL() {
}
public static SingletonDCL getInstance() {
if (sInstance == null) {
synchronized (SingletonDCL.class) {
if (sInstance == null) {
sInstance = new SingletonDCL();
}
}
}
return sInstance;
}
}
四、Double Check Lock(DCL) Android 源码使用举例
比如在 PackageManagerService 的 构造方法中调用多用户管理服务类UserManagerService的实例方法使用如下
代码位置:frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java
public class PackageManagerService extends PackageManagerServiceExAbs
implements PackageSender {
......
public PackageManagerService(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
......
// Initialize InstantAppRegistry's Instant App list for all users.
final int[] userIds = UserManagerService.getInstance().getUserIds();
......
SystemConfig systemConfig = SystemConfig.getInstance();
......
}
......
}
UserManagerService 获取多用户id的方法
代码位置:\frameworks\base\services\core\java\com\android\server\pm\UserManagerService.java
public class UserManagerService extends IUserManager.Stub {
......
private static UserManagerService sInstance;
public static UserManagerService getInstance() {
synchronized (UserManagerService.class) {
return sInstance;
}
}
......
public int[] getUserIds() {
synchronized (mUsersLock) {
return mUserIds;
}
}
......
}
SystemConfig的实例获取方法
代码位置:
frameworks\base\core\java\com\android\server\SystemConfig.java
public class SystemConfig {
......
static SystemConfig sInstance;
public static SystemConfig getInstance() {
synchronized (SystemConfig.class) {
if (sInstance == null) {
sInstance = new SystemConfig();
}
return sInstance;
}
}
......
}
友情推荐:
Android 干货分享
红包福利
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!