单例模式
Posted linbky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。
public class Singleton
private Singleton()
private static final Singleton singleton = new Singleton();
public static Singleton getInstance()
return singleton;
饿汉模式:优点(线程安全),缺点(项目启动会加载静态对象,占用内存空间)
public class Singleton private Singleton() private volatile static Singleton singleton = null; public static Singleton getInstance() if(singleton == null) synchronized (Singleton.class) if(singleton==null) singleton = new Singleton(); return singleton;
懒汉模式+双重检查锁
优点:线程安全,调用getInstance之后才会实例化
缺点:使用synchronized解决了线程不安全的问题,但是也造成同时只能有一个线程调用 getInstance,效率低,而synchronized只是保证了第一次实例化不会出现线程不安全的问题。
public class Singleton private Singleton() if(Singleton.getInstance()==null) throw new IllegalStateException(); public static Singleton getInstance() return lazyHolder.singleton; private static class lazyHolder private static final Singleton singleton = new Singleton();
静态内部类
- 反射能否打破单例?
首先,对外部类的私有构造器中加入 instance==null 的判断,防止反射入侵外部类。
其次,静态内部类保证了从外部很难获取 SingletonHolder 的 Class 对象,从而保证了内部类不会被反射。
- 多线程能否打破单例?
Holder 模式借用了饿汉模式的优势,就是在加载类(内部类)的同时对 instance 对象进行初始化。
由于自始至终类只会加载一次,所以即使在多线程的情况下,也能够保持单例的性质。
- 优势?劣势?
优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。
劣势:需要多加载一个类;相比于懒汉模式,Holder 创建的单例,只能通过 JVM 去控制器生命周期,不能手动 destroy
参考:https://www.cnblogs.com/jing-an-feng-shao/p/7501576.html
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章