
点击上面 “蓝字” 关注我们

单例设计模式
什么是单例模式?
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
为什么使用单例设计模式?
意图:
保证一个类仅有一个实例,并提供一个访问它的全局访问点对象
主要解决:
一个全局使用的类频繁地创建与销毁。
何时使用:
当您想控制实例数目,节省系统资源的时候。
单例设计模式8 种方法
饿汉式(静态常量)
饿汉式(静态代码块)
懒汉式(线程不安全)
懒汉式(线程安全,同步方法)
懒汉式(线程安全,同步代码块)
双重检查
静态内部类
枚举
单例设计模式具体实现
1 )饿汉式(静态常量)实例
代码实现

优缺点与总结:
优点:这种方式写法简单,在类装载的时候就完成实例化,避免了线程同步问题
缺点:在类装载的时候就完成实例化,没有达到Lazy Loading 懒加载 的效果,如果从始至终未使用过这个类,则会造成内存的浪费。(懒加载的意思就是什么时候用什么时候才加载)
结论:懒汉式单例设计模式可以用,但是会造成内存的浪费
2 )饿汉式(静态代码块)实例
代码实现

优缺点与总结:
优缺点与上面一样
结论:懒汉式单例设计模式可以用,但是会造成内存的浪费
3 )懒汉式(线程不安全)实例
代码实现


优缺点与总结:
优点:实现了Lazy Loading 懒加载 的效果
缺点:只能在单线程下使用,如果进入了多线程,
if(singletonInstance == null)
语句还未来得及向下执行,另一个线程也通过了这个判断语句,会导致产生多个实例,因此在严格意义上它并属于单例设计模式。在多线程下不能使用这种方式结论:在实际开发中不要使用这种方式。
4 )懒汉式(线程安全 同步方法)实例
代码实现


优缺点与总结:
优点:解决了线程安全的问题
缺点:效率太低,每个线程想要执行getInstance()方法时,都要进行同步,实际上这个方法只执行一次实例化就够了,之后就直接return 实例就好了,方法进行同步效率太低
结论:在实际开发中不推荐这种方式。
5 )懒汉式(线程不安全 同步代码块)实例
有的人也许会认为把上面同步方法换成同步代码块就可以了:如下:


优缺点与总结:
优缺点与 3) 一样
结论:在实际开发中不要使用这种方式。
6)双重检查 实例
代码实现



优缺点与总结:
优点:双重检查(double-check) 概念时多线程开发中经常用到的,在代码中我们进行了两次
if(singletonInstance == null)
判断,解决了线程安全问题第一个线程调用完getInstance方法后,其他的线程在第一层判断时,就会直接返回实例,避免反复进入同步代码块,解决了效率问题
结论:在实际开发中推荐使用这种方式。
7)静态内部类 实例
代码实现


优缺点与总结:
在Singleton进行装载的时候 其静态内部类SingletonInstance并不进行装载,等到需要实例化时调用getInstance方法时,静态内部类SingletonInstance才进行装载,完成Singleton类的实例化,类的静态属性,只有在第一次装载类的时候进行初始化,JVM帮我们实现了线程的安全性,并实现了懒加载。
优点:避免了线程的不安全,利用静态类实现延迟加载,效率高。
结论:在实际开发中推荐使用这种方式。
8 )枚举 实例
代码展示:

优缺点与总结:
这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。
结论:推荐使用
·
秒,转发只需 1 秒呦~一起加油
长按关注我们吧!!







