《Java中的单例模式》
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:MyEclipse 10、Java
作者:潘玉莹
撰写时间:2019-06-08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 单例的适用场景
- 需要生成唯一序列的环
- 需要频繁实例化然后销毁的对象。
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
- 方便资源相互通信的环境
比如:多程序读取一个配置文件时, 建议配置文件封装成对象。会方便操作其中数据, 又要保证多 个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
1.Java单例模式有五种实现方法饿汉式:线程安全,调用效率高,但是不能延时加载(直接将对象定义出来)
public class SingletonOne { private static final SingletonOne INSTANCE=new SingletonOne(); //实例化这个类 private SingletonOne(){ //1、隐藏构造器 } //创建静态工厂方法 ,让外部可以获取实例 public static SingletonOne getInstance(){ return INSTANCE; } } |
2.懒汉式:线程安全,调用效率不高,但是能延时加载(只给出变量,并不将其初始化)
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建) public class SingletonTwo { private static SingletonTwo instance; private SingletonTwo() { // 私有化构造器 } //方法同步,调用效率低 // 创建静态工厂方法,让外部可以获取实例 public static synchronized SingletonTwo getInstance() { if (instance == null) { instance = new SingletonTwo(); } return instance; } } |
3.Double CheckLock实现单例:Double CheckLock也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题, 不建议使用),是在懒汉式单例上发展而来
public class SingletonThree { private volatile static SingletonThree instance; private SingletonThree() { //私有化构造器 } public static SingletonThree newInstance() { //静态工厂方法,双重锁判断机制 if (instance == null) { synchronized (SingletonThree.class) { if (instance == null) { instance = new SingletonThree(); } } } return instance; } } |
4.静态内部类模式 特点:线程安全,调用效率高,可以延时加载
public class SingletonFour { private static class SingletonClassInstance { private static final SingletonFour instance = new SingletonFour(); } private SingletonFour() { // 私有化构造器 } public static SingletonFour getInstance() { //静态工厂方法 return SingletonClassInstance.instance; } } |
5.枚举类 特点:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用
public class SingletonFive { private SingletonFive(){//私有化构造器 } private static enum Singleton{ //使用枚举 INSTANCE; private SingletonFive singleton; private Singleton(){ //JVM会保证此方法绝对只调用一次 singleton = new SingletonFive(); } public SingletonFive getInstance(){ return singleton; } } |