单例模式

Posted zqq_hello_world

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

单例模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例
  1. 饿汉模式

    类一加载就创建类的实例

    public class Singleton {
    
        /**
         * 类加载时创建类的实例,饿汉模式
         */
        private static final Singleton singleton = new Singleton();
    
        /**
         * 构成方法私有化
         */
        private Singleton(){}
    
        /**
         * 对外提供该类的唯一实例
         * @return
         */
        public static Singleton getSingleton(){
            return singleton;
        }
    
    }
    
  2. 懒汉模式

    在调用获取单例类方法时,再去创建该实例,线程不安全,需要加线程互斥锁保证线程安全

    public class Singleton {
    
        /**
         * 实例对象初始为null
         */
        private static Singleton singleton = null;
    
        /**
         * 构成方法私有化
         */
        private Singleton(){}
    
        /**
         * 对外提供该类的唯一实例
         * 调用实例时判断是否存在该实例,线程不安全
         * @return
         */
        public static Singleton getSingleton(){
            if(singleton == null){
                singleton = new Singleton();
            }
            return singleton;
        }
    
    }
    

    懒汉模式—线程安全

    public class Singleton {
    
        /**
         * 实例对象初始为null,volatile保证内存可见性
         */
        private static volatile Singleton singleton = null;
    
        /**
         * 构成方法私有化
         */
        private Singleton(){}
    
        /**
         * 对外提供该类的唯一实例
         * 判断singleton是否为null,如果为null获取锁去创建
         * 双重为null判断,防止在获取锁时,对象已被创建
         * @return
         */
        public static Singleton getSingleton(){
            if(singleton == null){
                synchronized (Singleton.class){
                    if(singleton == null){
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    
    }
    

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块