美文网首页
Android 单例模式学习

Android 单例模式学习

作者: 程序员Android1 | 来源:发表于2020-05-08 11:06 被阅读0次

    和你一起终身学习,这里是程序员 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 干货分享
    红包福利

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

    相关文章

      网友评论

          本文标题:Android 单例模式学习

          本文链接:https://www.haomeiwen.com/subject/dcyxnhtx.html