单例模式
现在了解到的单例模式有懒汉模式、饿汉模式 、静态内部类模式、静态代码块模式、单元素枚举类模式、登记模式
懒汉模式
- 双重检查实现方式:
/**
* @author :tigermeng.
* @date :17:52 2019-08-06
*/
package com.mhc.pf.singleton;
/**
*
* @author :tigermeng.
* @date :17:52 2019-08-06
*
*/
public class Singleton {
private static volatile Singleton instance;//1、volatile保证对所有线程可见
private Singleton(){
//构造私有化
}
/**
* 获取单例对象
* @return
*/
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){//对Class类对象进行上锁,并不是对instance实例对象(试试就知道错在哪里了)
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
饿汉模式
静态内部类模式
静态内部类模式(Holder),使用私有的静态内部类,来存储外部类的单利,这种静态内部类称为Holder,使用更少的代码来实现延迟加载的目的。(静态的内部类的特性:外部类静态方法可以直接拿到内部类持有的对象,私有的也可以;静态内部类可调用外部类的方法)
/**
* @desc :
* @author :tigermeng.
* @date :11:06 2019-06-18
*/
package com.designpattern;
/**
*
* @desc :静态内部类单例模式
* @author :tigermeng.
* @date :11:06 2019-06-18
*
*/
public class StaticSingleton {
/**
* 构造私有化,外部不能新建该对象
* instance非空判断,防止反射入侵外部类构造方法
* 静态内部类也保证了反射很难从外部获取hold的对象;
*
* 静态内部类,jvm来控制生命周期,不能手动的销毁,保证了instance的单例特性
*/
private StaticSingleton(){
if(SingletonHolder.instance != null){
throw new IllegalStateException("singleton instance is created already");
}
}
/**
* 内部类调用外部类构造方法生成内部类持有对象
*/
private static class SingletonHolder{
private static StaticSingleton instance = new StaticSingleton();
}
public static StaticSingleton getInstance(){
return SingletonHolder.instance;
}
}
单元素枚举模式
登记模式
参考连接:https://www.cnblogs.com/jing-an-feng-shao/p/7495048.html