IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android单例模式的种类与优缺点 -> 正文阅读

[移动开发]Android单例模式的种类与优缺点

目录

单例模式定义:

单例模式核心原理:

使用单例模式需要注意哪几方面的问题:

饿汉单例

懒汉单例

DCL 单例(Double Check Lock)

静态内部类单例(推荐)

枚举单例

容器单例

最后

静态内部类时如何保证线程安全的:


单例模式定义:

1.确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式核心原理:

1.将构造函数私有化;
2.通过静态方法获取唯一一个实例;

使用单例模式需要注意哪几方面的问题:

1.对象的资源消耗;
2.多余的同步;
3.线程安全;

饿汉单例

public class HungrySingletone {

    private static HungrySingletone instance = new HungrySingletone();

    private HungrySingletone() { }

    public static HungrySingletone getInstance() {
        return instance;
    }

}

优点:

缺点: 应用运行时,在非必要的情况下实例化,不节约内存空间

懒汉单例

public class LazySingletone {

    private static LazySingletone instance;

    private LazySingletone() { }

    /**
     * 获取实例时 初始化实例
     * @Description 考虑多线程并发调用getInstance,添加synchronized关键字
     * @return
     */
    public static synchronized LazySingletone getInstance() {
        if (instance == null) {
            instance = new LazySingletone();
        }
        return instance;
    }

    //每一次getInstance 都会被同步锁 开销, 并不是getInstance需要同步锁,
    //而是在new实例的时候需要同步锁
}

优缺点:

优点:相较于饿汉单例模式,在使用时才会实例化

缺点:多余的同步。为了保证多线程下单例对象唯一,getInstance()添加 synchronized 关键字,每次调用getInstance方法都会进行同步开销。

DCL 单例(Double Check Lock)

public class DclSingletone {

    private static DclSingletone instance;

    private DclSingletone() { }

    /**
     * 每一次getInstance
     *
     * @return
     * @Description 两重判断,做到单例模式的极致
     */
    public static DclSingletone getInstance() {
        //已经实例过,不需要同步锁
        if (instance == null) {
            synchronized (DclSingletone.class) {
                //第一次 多线程排队,初始实例  还是要在内部判空 是否new
                if (instance == null) {
                    instance = new DclSingletone();
                }
            }
        }
        return instance;
    }
}

优点:使用时实例化,线程安全,没有多余的同步

缺点:(在并发场景比较复杂,或者低于 JDK6 版本下使用,Dcl可能会失效,这个场景还不太懂 )

静态内部类单例(推荐)

public class StaticInnerSingletone {

    private StaticInnerSingletone() { }

    private static class InnerSingletoneHolder {
        private static final StaticInnerSingletone instance = new StaticInnerSingletone();
    }

    public static StaticInnerSingletone getInstance() {
        return InnerSingletoneHolder.instance;
    }

    //只有在第一次调用getInstance 才会初始化instance 不仅能够保证线程安全,也能保证单例对象的唯一性,同时也延迟了
    //单例对象的实例化,所以这是推荐使用的单例模式实现方式。

}

优点:使用时实例化,线程安全,没有多余的同步

缺点:

枚举单例

public enum SingletomeEnum {
    INSTANCE;
    //public method...
}

优点:写法简单..

缺点:(enum是不是占用内存多啊...)

容器单例

public class SingletoneManager {
    
    private static Map<String,Object> objMap = new HashMap<String,Object>();
    
    private SingletoneManager() { }
    
    public static void registerService(){
        
    }
    
    public static Object getService(String key){
        
    }
}

优点:多种单例类型注入到一个单例管理类,降低使用成本,并隐藏具体实现,降低耦合度。(系统 context 的 getSystemService() 使用容器单例)

缺点:看初始消耗的内存值不值得...

最后

静态内部类时如何保证线程安全的:

静态内部类的特点:外部类加载时不需要加载静态内部类,不被加载则不占用内存,(延迟加载)当外部类调用getInstance方法时,才加载静态内部类,静态属性保证了全局唯一,静态变量初始化保证了线程安全,所以这里的方法没有加synchronized关键字(JVM保证了一个类的 初始化在多线程下被同步加锁)

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:40:21  更:2021-09-24 10:41:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:10:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码