一、单例模式
详细介绍:
https://zhuanlan.zhihu.com/p/33102022
1.定义:确保一个类只有一个实例,并为整个系统提供一个全局访问点 (向整个系统提供这个实例)。
2.三要素:私有构造方法、指向自己实例的的私有静态引用、以自己实例为返回值的静态的公有方法。
3.优点
-
在内存中只有一个对象,节省内存空间;
-
避免频繁的创建销毁对象,可以提高性能;
-
避免对共享资源的多重占用,简化访问;
-
为整个系统提供一个全局访问点。
二、代码实现
1.懒汉式
1 package DesignPattern; 2 //懒汉式单例实现 3 public class Singleton { 4 // 定义一个变量来存储已经创建好的类实例 5 private static Singleton uniqueInstance = null; 6 // 私有化构造方法 7 private Singleton(){ 8 System.out.print("懒汉单例"); 9 } 10 // 定义一个方法来为客户端提供类实例 11 public static synchronized Singleton getInstance(){ 12 if(uniqueInstance==null){ 13 uniqueInstance = new Singleton(); 14 } 15 return uniqueInstance; 16 } 17 18 }
2. 双重检测机制
package DesignPattern; public class Singleton3 { // volatitle 防止指令重排序 private volatile static Singleton3 instance = null; private Singleton3(){ System.out.println("双重检测机制--单例"); } public static Singleton3 getInstance(){ if(instance==null){ synchronized(Singleton3.class){ if(instance==null){ instance = new Singleton3(); } } } return instance; } }
3.饿汉式
1 package DesignPattern; 2 //饿汉单例 3 public class Singleton2 { 4 // 定义一个变量来存储创建好的类实例,直接在这里创建类实例只能创建一次 5 private static Singleton2 uniqueInstance = new Singleton2(); 6 // 私有化构造方法 7 private Singleton2(){ 8 System.out.print("饿汉单例"); 9 } 10 // 定义一个方法来为客户端提供类实例 11 // 构造方法被私有化了,外部创建不了类实例就没有办法调用这个对象的方法,就实现不了功能调用 12 // 单例模式决定让这个类提供一个方法来返回类的实例 13 // 在方法上加上static,这样就可以直接通过类来调用这个方法,而不需要先得到实例 14 public static Singleton2 getInstance(){ 15 return uniqueInstance; 16 } 17 }
4.调用
1 package DesignPattern; 2 3 public class main { 4 public static void main(String[] args) { 5 Singleton.getInstance(); 6 Singleton2.getInstance();
Singleton3.getInstance();
7 } 8 }
5.Holder模式(静态内部类)
1 package DesignPattern; 2 3 public class Singleton4 { 4 private static class SingletonHolder{ 5 private static Singleton4 instance = new Singleton4(); 6 private SingletonHolder(){} 7 } 8 private Singleton4(){ 9 System.out.println("静态内部类"); 10 } 11 public static Singleton4 getInstance(){ 12 return SingletonHolder.instance; 13 } 14 }
三、总结
实现方式 | 关键点 | 资源浪费 | 线程安全 | 多线程环境的性能足够优化 |
---|---|---|---|---|
基础饱汉 | 懒加载 | 否 | 否 | - |
饱汉变种1 | 懒加载、同步 | 否 | 是 | 否 |
饱汉变种2 | 懒加载、DCL | 否 | 否 | - |
饱汉变种3 | 懒加载、DCL、volatile | 否 | 是 | 是 |
饿汉 | 静态变量初始化 | 是 | 是 | 是 |
Holder | 静态变量初始化、holder | 否 | 是 | 是 |
枚举 | 枚举本质、静态变量初始化 | 否 | 是 | 是 |