设计模式--单例模式(含枚举)
作者:互联网
单例模式
核心:构造器私有
缺陷:不安全,建议才用枚举进行
饿汉单例
举例:ErrorContext和LogFactory
缺点:易造成资源浪费
class HungryMan{
private HungryMan(){}
private final static HungryMan hungryMan=new HungryMan();
public static HungryMan getInstance(){
return hungryMan;
}
}
懒汉单例(DCL)
class LazyMan{
private LazyMan(){}
//colatile 实现原子性操作
private volatile static LazyMan lazyMan=null;
//双重检测锁
public static LazyMan getInstance(){
if(lazyMan==null){
synchronized(LazyMan.class){
if(lazyMan==null){
lazyMan=new LazyMan();
}
}
}
}
return lazyMan;
}
原子性操作(是不需要synchronized):所谓原子操作是指不会被线程调度机制打断
的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何
context switch (切换到另一个线程)
原子性操作的过程:(这属于底层,不能理解可前往学习JUC)
1.分配内存空间
2.执行构造方法,初始化对象
3.将对象指向这个空间
若不是原子性操作可能会执行的顺序为132等情况,从而产生指令重排的问题
静态内部类
感觉没啥作用
class A{
private A(){}
public static getInstance(){
return InnerClass.a;
}
public static Class InnerClass{
private static final A a=new A();
}
}
枚举
解决单例模式不安全的问题
单例模式易被反射破解
public Enum EnumSingle(){
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}
本文章在学习狂神说的单例模式后整理(B站搜索狂神说)同时参考了百度百科等网络资源
标签:--,private,LazyMan,HungryMan,static,单例,设计模式,public 来源: https://blog.csdn.net/Caiabcd/article/details/118067281