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 干货分享
红包福利

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

上一篇下一篇

猜你喜欢

热点阅读