设计模式(Design pattern)提供了在软件开发过程中面临的一系列问题的最佳解决方案,是Java开发者必修的一门课程。次要分创立型模式、结构型模式和行为型模式单例模式是Java中最简略的设计模式之一,属于创立型模式

单例模式

单例模式从字面的角度来讲 繁多实例 / 一个对象模式.
那么首先咱们须要思考的是谁去创立这个对象,或者说拿什么去创立这个对象.
创建对象的时候咱们都须要调用咱们类中的构造方法,那么谁都能够调用咱们的构造方法,咱们就没方法使其有且只有一个对象,那么如何能力让一个类有且只有一个对象呢.
咱们须要将构造方法私有化,并且在类中本人去创立这个惟一的实例,而后提供一个能够被内部拜访的办法.
单例模式中最罕用的两种:饿汉式,懒汉式

一、饿汉式

顾名思义:饿,狼吞虎咽,只有有,我就吃.
就是指当类被加载的时候就会创建对象.

/** * Author:Lss * Date: 2020-09-27 11:16 * Description: 饿汉式单例模式 * 长处:类加载时实现初始化,并且没有桎梏,进步执行效率. * 毛病:类加载的时候就初始化,不论用与不必都占用内存空间,节约了内存,且加载速度慢. */public class HungryPattern {     //通过private封装创立好的对象 -- 公有属性对外界不可见     private static final HungryPattern hungryPattern = new HungryPattern();     //创建对象的时候都会调用咱们的构造方法     //私有化构造方法 -- 目标就是为了管制外界创建对象的权限     private HungryPattern() {        System.out.println("HungryPattern对象被创立了!");     }   /**    * 既然公有的结构形式,没有方法new对象了,也就没方法通过 援用.办法 的形式来调用,    * 那么还想调用就必须将其申明为static动态的,这样就能够通过类名.调用,    * 而且什么中央都能够拜访就必须将访问控制修饰符设置为 public    */     public static HungryPattern getInstance(){            return hungryPattern;     }}

一、懒汉式

顾名思义:懒,不会提前做筹备工作,只有逼到份儿上,才会做.
就是指当第一次被应用的时候才会创建对象.

1.懒汉式单例模式(线程不平安)
/** * Author:Lss * Date: 2020-09-27 11:18 * Description: 懒汉式单例模式(线程不平安) * 长处:第一次调用才创建对象,防止内存节约。 * 毛病:多线程不平安,因为没有加锁 synchronized,不能保障单例 * 不举荐应用 */public class LazyPattern {    //封装创立好的对象 -- 先不创建对象,啥时候用啥时候创立(懒)    private static LazyPattern lazyPattern = null;    //私有化构造方法  --  目标就是为了管制外界创建对象的权限    private LazyPattern(){        System.out.println("LazyPattern对象被创立了!");    }    //提供了公开的获取对象的办法    public static LazyPattern getInstance(){        if (lazyPattern == null){            lazyPattern = new LazyPattern();        }        return lazyPattern;//提早加载    }}
2.懒汉式单例模式(线程平安)
/** * Author:Lss * Date: 2020-09-27 11:23 * Description: 懒汉式单例模式(线程平安 - 锁办法) * 长处:第一次调用才创建对象,防止内存节约。 * 毛病:加锁synchronized保障了单例,然而锁的范畴太大,影响效率 * 不举荐应用 */public class LazyPattern {    //封装创立好的对象 -- 先不创建对象,啥时候用啥时候创立(懒)    private static LazyPattern lazyPattern = null;    //私有化构造方法  --  目标就是为了管制外界创建对象的权限    private LazyPattern(){        System.out.println("LazyPattern对象被创立了!");    }    //提供了公开的获取对象的办法    public static synchronized LazyPattern getInstance(){        if (lazyPattern == null){            lazyPattern = new LazyPattern();        }        return lazyPattern;//提早加载    }}
3.懒汉式单例模式(线程平安 -- 双重校验)

双重校验:咱们又称双检锁/双重校验锁(DCL,即 double-checked locking)

/** * Author:Lss * Date: 2020-09-27 11:28 * Description: 懒汉式单例模式(线程平安 - 双重查看) * 长处:双重查看在多线程平安的状况下,减小了锁的范畴,即保障了平安的状况下也放弃了高性能 * 举荐应用 */public class LazyPattern {    //封装创立好的对象 -- 先不创建对象,啥时候用啥时候创立(懒)    private static LazyPattern lazyPattern = null;    //私有化构造方法  --  目标就是为了管制外界创建对象的权限    private LazyPattern(){        System.out.println("LazyPattern对象被创立了!");    }    //提供了公开的获取对象的办法    public static LazyPattern getInstance(){        //先查看实例是否存在,如果不存在才进入上面的同步块        if (lazyPattern == null){            //同步块            synchronized(LazyPattern.class){                //再次查看实例是否存在,如果不存在才创立实例                if (lazyPattern == null){                    lazyPattern = new LazyPattern();                }            }        }        return lazyPattern;//提早加载    }}
4.懒汉式单例模式(线程平安 -- 动态外部类实现)
/** * Author:Lss * Date: 2020-09-27 11:39 * Description: 懒汉式单例模式(线程平安 - 动态外部类实现)  * 举荐应用 */public class LazyPattern {    //私有化构造方法  --  目标就是为了管制外界创建对象的权限    private LazyPattern(){        System.out.println("LazyPattern对象被创立了!");    }    private static class InnnerSingleton{        private static final LazyPattern LAZY_PATTERN = new lazyPattern();    }    //提供了公开的获取对象的办法    public static LazyPattern getInstance(){            return InnnerSingleton.LAZY_PATTERN;//提早加载    }}