设计模式之单例模式

定义

       单例模式属于创建型模式,是设计模式中最简单的设计模式之一,其最大的特点是只有一个实例。当某一个类频繁被其他对象进行调用,为减少该类被频繁的创建和销毁,单例模式则派上用场。

       单例模式主要处理多个线程的统一操作,比如计数器的实现、多线程对于统一文件的操作等等。但是单例模式的实现与Java设计原则中的单一职责原则相冲突。

实现

       单例模式的实现有很多种,比如饿汉模式、懒汉模式、静态内部类,甚至枚举值实现等。每种实现方式各有特点,对于线程安全和是否延迟加载也各有不同。下面分别对于其多种实现方式进行简单介绍和实现。

  饿汉模式

/**
 * 单例模式--饿汉模式: 线程安全的
 */
public class SingletonDemoHungry {

    private static SingletonDemoHungry instance = new SingletonDemoHungry();

    private SingletonDemoHungry() {
    }

    public static SingletonDemoHungry getInstance(){
        return instance;
    }
}

  懒汉模式

/**
 * 单例模式--懒汉模式: 线程安全的
 *
 * 双重校验锁的方法: 在多线程的情况下, 保证代码块只能被一个线程锁定
 * volatile: 可以防止指令重排, 即保证在 写 操作之前,不会进行读操作
 *
 */
public class SingletonDemoLazy {

    private volatile static SingletonDemoLazy instance = null;

    private SingletonDemoLazy() {
    }

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

  静态内部类

/**
 * 单例模式--静态内部类: 线程安全的
 *
 * 静态内部类的方式:只有在调用getInstance() 方法时才会去加载,类似于懒汉模式
 * 它是线程安全的
 */
public class SingletonDemoStaticClass {

    //内部类
    private static class SingletonClassHolder{
        private static SingletonDemoStaticClass instance = new SingletonDemoStaticClass();
    }

    private SingletonDemoStaticClass() {
    }

    //外部调用获取该类的方法时才会调用静态内部类的方法
    public static SingletonDemoStaticClass getInstance(){

        return SingletonClassHolder.instance;
    }
}

  枚举值

/**
 * 单例模式--枚举方法, 线程安全
 *
 * 外部调用它的方法直接通过 SingletonDemoEnum.INSTANCE.itsMethod() 即可
 */
public enum SingletonDemoEnum {
    INSTANCE;

    public void itsMethod(){
        System.out.println("itsMethod has been called! ");
    }
}
原文地址:https://www.cnblogs.com/Demrystv/p/11948974.html