设计模式之单例模式

    技术2022-07-10  148

    设计模式详情页请点击回到主页。

    单例模式概念:

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时

    确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。

    这里主要介绍三种方式:懒汉式单例、饿汉式单例、登记式单例。

    1、懒汉式,线程不安全(不推荐使用) 描述:这种方式是懒加载的,但线程不安全,在多线程下不能正常工作。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。

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

     

    2、懒汉式之加同步锁 描述:这种方式是懒加载的,且线程安全。由于加了锁 synchronized,所以比较影响效率(绝大多数的调用都是单线程的,每次调用都加锁)。

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

    3、懒汉式之双重校验锁

    描述:这种方式也是懒加载的,且线程安全。由于只有instance为null时,才会取加锁所以比第2中效率要高。

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

    4、饿汉式

    描述:这种方式不是懒加载的,但是线程安全。由于只不用加同步锁,效率很高(缺点是,类一加载就初始化比较占用内存)。

    public class Singleton1 { private Singleton1(){} private static Singleton1 instance = new Singleton1(); public static Singleton1 getInstance() { return instance; } }

    5、登记式(要求懒加载时,推荐使用这种方式)

    描述:这种方式是懒加载的,且是线程安全的;使用了静态内部类,Singleton 类初始化时,由于SingletonHolder 类还没有初始化,所以不会声明对象;只有调用getInstance()方法时,才会加载SingletonHolder 类并初始化对象。

    public class Singleton { //通过静态内部类实现 private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }

     

                   
    Processed: 0.015, SQL: 12