单例模式
-
单例模式(Singleton)是设计模式中最常见、最简单的模式之一 ,属于构建/建造型模式
-
设计模式(design pattern):针对软件开发过程中的某一类问题形成的方案。到目前为止,在软件开发过程中,有上百种设计模式,其中比较常用的有24种
-
单例模式,顾名思义,指的是在全局只存在唯一的一个实例对象
-
单例模式有六种实现方式:饿汉式 、懒汉式 、单重所、双重锁(DCL)、枚举式、内部类式
-
饿汉式
javapublic class A { // 在类中准备好一个对象,希望所有的使用者都只用准备号的唯一对象 // 饿汉式:在定义对象的时候就初始化对象 // 缺点:无论是否需要使用这个对象,在第一次调用这个类的时候都会初始化这个对象,从而增长了类的加载时间 // 优点:没有线程的并发问题 - 类只加载一次,所以静态对象也只初始化一次 private static final A a = new A(); // 不允许在类外随便创建对象 - 构造函数私有化 private A(){} public static A get(){return a;} }
-
懒汉式
javapublic class A { // 懒汉式:在定义对象的时候不初始化对象,而是在第一次调用方法的时候再初始化这个对象 // 优点:在有需要的时候才会初始化对象,从而缩短了类的加载时间 // 缺点:会产生线程的并发问题 private static A a; private A(){} public static A get(){ if(a == null) a = new A(); return a; } }
-
单重锁
javapublic class A { private static A a; private A(){} public static A get(){ // 优点:保证线程的并发安全 // 缺点:锁本质上就是保证线程的"独占",因此加锁和解锁都需要消耗资源 // 当对象被初始化之后,后续的所有的线程都需要先加锁,然后判断是否为空,再解锁,也就意味着所有的线程都需要经历锁的过程 synchronized(A.class){ if(a == null) a = new A(); } return a; } }
-
双重锁(DCL - Double Check Lock)
javapublic class A { private static A a; private A(){} public static A get(){ if(a == null){ synchronized(A.class){ if(a == null){ synchronized(A.class){ a = new A(); } } } } return a; } }
-
枚举式
javaenum A{ a }
-
内部类式
javapublic class A { public static class AI{ private static final AI instance = new AI(); } public static AI getInstance(){ return AI.instance; } }
-