• 单例设计模式


    单例模式

    确保单例类只有一个实例,而且这个单例类提供一个借口让其他类获取到这个唯一的实例;

    • 如果某各类创建时,需要消耗太多的资源,或者这个类占用很多内存,如果创建太多这个类的实例会导致内存占用太多,此时我们就可以使用单例模式;

    单例模式(懒汉写法,单线程)

    public class Singleton {
        private static Singleton instance = null;
        private Singleton() {
        }
        public static Singleton getInstance() {
            if(instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    

    考虑到线程安全的写法

    public class Singleton {
        private static volatile Singleton instance = null;
        private Singleton(){
        }
        public static Singleton getInstance(){
            if (instance == null){
                synchronized ( Singleton.class){
                    if (instance == null){
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    
    • 第一次判断是为了避免不必要的同步,第二次判断是为了确保在此之前没有其他线程进入到sychronized块创建了新实例;
    • 不在public static Singleton getInstance()中加synchronized是为了避免同步执行,导致的效率低;
    • 由于instance = new Singleton();会执行1)给Singleton的实例分配内存,2)调用Singleton的构造函数初始化字段,3)将instance对象执行分配的对象,但是由于无法确保上面三个执行的顺序,有可能先将instance指向内存实例,再进行初始化,所有我们需要加上volatile修饰,线程每次调用volatile修饰的变量的时,都会去堆中拿最新的数据,确保instance是最新的。
      Android中的单例模式,比如:获取WindowManager对象的引用。

    待续

    GitHub:https://github.com/godfunc
    博客园:http://www.cnblogs.com/godfunc
    Copyright ©2019 Godfunc
  • 相关阅读:
    如果你正在找工作,也许这七个方法会帮到你
    WebSocket 浅析
    关系数据库涉及中的范式与反范式
    MySQL字段类型与合理的选择字段类型
    ER图,数据建模与数据字典
    详解慢查询
    MySQL的最佳索引攻略
    后端技术演进
    MySQL主从复制(BinaryLog)
    MySQL读写分离
  • 原文地址:https://www.cnblogs.com/Godfunc/p/6554100.html
Copyright © 2020-2023  润新知