定义
单例模式属于创建型模式,是设计模式中最简单的设计模式之一,其最大的特点是只有一个实例。当某一个类频繁被其他对象进行调用,为减少该类被频繁的创建和销毁,单例模式则派上用场。
单例模式主要处理多个线程的统一操作,比如计数器的实现、多线程对于统一文件的操作等等。但是单例模式的实现与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! "); } }