Java设计模式—单例模式

Posted 小筱萌

tags:

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

  • 定义

       保证只有一个实例存在,并提供一个访问它的全局访问点。

  • 优点

      1. 避免对共享资源的多重占用。

      2. 节约系统资源,当需要频繁的去创建以及销毁一个对象时,该模式可以提高系统性能。

  • 缺点

      1. 没有抽象层,不利于扩展。不适用于变化的对象中

      2. 职责过重,违反单一职责原则。

  • 使用场景

      数据库的连接池、多线程的连接池、日志文件的实现等。

  • 具体实现

      1. 为防止创建多个实例,构造函数进行私有化。

      2. 建立一个类静态变量,持有一个自己的实例。

      3. 通过静态方式对外部提供自己的实例。

  • 对静态实例的初始化有以下几种方式

      1. 饿汉式

        优点:

        1. 线程安全。因为类加载的方式是按需加载且只加载一次(在类进行初始化的时候其他线程是没办法进入的),所以该类只会被创建一个实例, 即JVM帮我们保证了饿汉模式天生就是线程安全的。

        2. 在类加载的同时已经创建好了一个静态对象,调用时反应速度会很快。

        缺点:

        资源效率不高,可能getInstance()永远不会被执行到,但是执行该类的其他静态方法或者加        载了该类(class.forName),那么它仍然会被初始化,造成资源的浪费。

public class Instance {

    private static Instance instance = new Instance();

    //私有化构造函数
    private Instance() {
    }

    public static Instance getInstance() {
        return instance;
    }

}

   2. 懒汉式

        优点:资源利用率高,在不执行getInstance()时不会被实例化,可以执行该类的其他静态方法。

        缺点:线程不安全,在多线程条件下可能会创建多个实例。

public class Instance {

   private static Instance instance;

    //私有化构造函数
    private Instance() {
    }

    public static Instance getInstance() {
        if (instance == null) {
            instance = new Instance();
        }
        return instance;
    }

}

 3. 双重检测锁DCL(推荐使用)

     优点:线程安全、延迟加载、效率高。

     该模式既能保证线程的安全,又能使性能不受到很大的影响,因为它只会在第一次创建实例的时候进行同步。

     本模式创建的类静态变量通常用volatile关键字修饰,作用是保证该变量的可见性和原子性。

public class Instance {

    private static volatile Instance instance;

    //私有化构造函数
    private Instance() {
    }

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

}

4. 静态内部类(推荐使用)

    优点:线程安全,延迟加载,效率高。

    该模式也采用了类装载机制来保证初始化实例时只有一个线程,且只有在调用getInstance()的时候才会装载Instance类。相比于饿汉方式有了Lazy-Loading的作用。

public class Instance {

    //私有化构造函数
    private Instance() {
    }

    private static class SignleInstance {
        private static final Instance instance = new Instance();
    }

    public static Instance getInstance() {
        return SignleInstance.instance;
    }


}

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

java 单例模式这个要怎么理解?

Java设计模式--单例模式(代码详解懒汉饿汉模式)

Java中的单例模式

Java设计模式之单例模式

Java 设计模式——单例模式 理论代码相结合

Java模式设计之单例模式(二)