1.前言
提起设计模式,可能大家有些人会感觉陌生,有些人会觉得经常使用。其实说到设计模式,不用感到陌生与害怕,其实我们每天在不经意间都在或多或少的使用或者接触设计模式。这篇文章就是想带大家了解最基础的设计模式,单例模式!
2.简介
单例模式是指,有且只有一个该类的实例化对象,并且实例化过程由这个类自己实现。该类的构造函数是私有化的。
3.常见的几种单例模式
饿汉式单例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 15:48 * 描述:饿汉式单例模式 * 优点:1.空间换时间,每次都直接加载,节约了创建实例的时间 * 缺点:1.因为不管是否用到了该类,都会直接创建实例,所以在不使用的情况下,就浪费了空间 */public class HungrySingleton { private static HungrySingleton sSingleton = new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return sSingleton; } }
懒汉式单例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 15:45 * 描述:懒汉式单例模式 * 优点:1.时间换空间,在调用的时候才创建实例,节约了空间 * 2.每次getInstance的时候才创建实例,节约了资源 * * 缺点:1.每次在调用的时候才创建实例,有点浪费时间 * 2.每次调用getInstance都需要线程同步,造成不必要的开销 */public class LazySingleton { private static LazySingleton sSingleton; private LazySingleton(){} public static synchronized LazySingleton getInstance(){ if (sSingleton==null){ sSingleton=new LazySingleton(); } return sSingleton; } }
DCL(Double Check Lock)单例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 16:16 * 描述:DCL(Double Check Lock)单例模式 * 优点:1.在懒汉式的基础上进行了判断,只有在第一次创建实例的时候才会,进行线程同步操作。资源利用率高 * 缺点:1.高并发情况下会出现问题 * 2.JDK1.5之前会出现问题。由于Java编译器允许处理器乱序执行,JDK之前JMM中Cache寄存器到主内存回写顺序的规定,可能1-2-3,也可能1-3-2,所以可能JDK1.5之前出现问题 * (1)给DclSingleton分配内存 * (2)调用DclSingleton()的构造函数,初始化成员字段; * (3)将mSingleton指向分配的内存空间(此时mSingleton不为null) */public class DclSingleton { private static DclSingleton mSingleton=null; private DclSingleton(){} public static DclSingleton getInstance(){ if (mSingleton==null){ synchronized (DclSingleton.class){ if (mSingleton==null){ mSingleton=new DclSingleton(); } } } return mSingleton; } }
静态内部类单例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 16:14 * 描述:静态内部类单例模式 * 优点:1.保证了线程安全问题,也能保证单例的唯一性(推荐) * 缺点: */public class StaticSingleton { private StaticSingleton(){} private static StaticSingleton getInstance(){ return StaticSingletonHolder.sSingleton; } private static class StaticSingletonHolder{ private static final StaticSingleton sSingleton=new StaticSingleton(); } }
4.后续
上面例举了几种常见的单例模式,其中本人最为常用的是静态内部类单例模式。当然这四种并不是所有的单例模式,还有枚举单例模式,以及使用Map容器实现的单例模式。如果是想直接找一个单例模式使用的话,那就直接复制代码就好。如果想知道他们的优缺点的话,就可以看下注释。还是那句话风里雨里在这里等你,您的一个赞或者收藏就是我写下去的动力,希望大家共同进步。如有错误请及时提出我也好改正。
作者:BurdeNing
链接:https://www.jianshu.com/p/a58f7768bea0