单例模式就是采取一定方法保证在整个软件系统中,对于某个类只能存在一个对象的实例,并且该类只提供一个取得其对象实例的方法。属于创建型。
优点
- 在内存里只有一个实例,减少了内存开销
- 可以避免对资源的多重占用
- 设置全局访问点,严格控制访问
单例的实现
懒汉式
/** * 懒汉式单例模式 * (在多线程下不能保证创建的实例是唯一的) */ public class LazySingleton { private LazySingleton(){} //和饿汉式不同,这里不实例化,而是在需要的时候再去new private static LazySingleton instance; //在多线程下不能保证创建的实例是唯一的 public static LazySingleton getInstance(){ if(instance==null){ instance = new LazySingleton(); } return instance; } }
懒汉式改进(线程安全)
/** * 懒汉式改进 线程安全的单例模式 */ public class SynchronizedSingleton { private SynchronizedSingleton(){} //和饿汉式不同,这里不实例化,而是在需要的时候再去new private static volatile SynchronizedSingleton instance; //双重加锁 public static SynchronizedSingleton getInstance(){ if(instance == null){ synchronized (SynchronizedSingleton.class){ if(instance == null){ instance = new SynchronizedSingleton(); } } } return instance; } }
使用synchronized保证创建单例对象时的线程安全,使用volatile修饰instance,防止在执行instance = new SynchronizedSingleton()时候发生指令重排序带来线程安全问题。
静态内部类
大专栏 设计模式:单例模式ss="line-numbers language-java"> public class InnerClassSingleton { public static InnerClassSingleton getInstance(){ return Singleton.singleton; } private static class Singleton{ private static InnerClassSingleton singleton = new InnerClassSingleton(); } private InnerClassSingleton(){} }
饿汉式
/** * 饿汉式单例模式 */ public class HungrySingleton { //将构造函数私有化,不允许外部对象直接调用 private HungrySingleton(){} private static final HungrySingleton instance = new HungrySingleton(); //对外提供唯一用于获取实例的方法 public static HungrySingleton getInstance(){ return instance; } }
枚举实现单例
public enum EnumSingleton { INSTANCE; }
来源:https://www.cnblogs.com/liuzhongrong/p/12289600.html