单例模式 Singleton
参考:https://www.cnblogs.com/zuoxiaolong/p/pattern2.html 侵权删除
什么是单例模式:保证在程序运行周期,至多有一个该对象。
适用性:对象多次重复实例化的场景
单例模式分类:饿汉式、懒汉式、静态内部类
代码要点:
私有化构造函数:保证外部不能实例化对象
私有静态对象:不公开只能通过公开静态获取对象的方法获取对象、公开静态获取对象的方法是静态所以静态
公开静态获取对象的方法:在没有实例的情况下,对开提供获取对象方法。
基本代码如下:
package EagerSingleton; /** * 饿汉模式:类的初始化阶段就实例化对象,如果未使用到该对象,会造成资源的浪费,不存在线程安全问题。 * */ public class EagerSingleton { //上来就实例化对象,如果未使用到该对象,会造成资源的浪费 private static EagerSingleton instance = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance(){ return instance; } }
package LazySingleton; /** * 懒汉模式 * 只有当第一次需要使用该类的对象时,才创造类,比较的懒 * 为了保证在多线程的情况下只能创建一个实例,可以使用双检查锁,单检查锁(下面的代码没有实现) * 单检查锁:保证一个实例,但是性能不高,许多线程处于阻塞状态。 * 双检查锁:由于JVM的reorderu优化的原因,可能其他线程会返回一个null的实例 */ public class LazySingleton { private static LazySingleton instance; private LazySingleton() { } public static LazySingleton getInstance(){ if(instance==null){ //instance = new LazySingleton(); synchronized (LazySingleton.class){ if(instance==null){ instance = new LazySingleton(); } } } return instance; } }
package InnerSingleton; /** * 静态内部类的方法 * 静态内部类中保存单例,当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化,instance得到实例化。 * 因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性 */ public class InnerSingleton { private InnerSingleton(){} //当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化 private static class SingletonHolder{ // instance得到实例化。 private static InnerSingleton instance = new InnerSingleton(); } public static InnerSingleton getInstance(){ return SingletonHolder.instance; } }