Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
单例模式可以说是Java中最简单的设计模式,也是技术面试中频率极高的面试题。因为它不仅涉及到设计模式,还包括了关于线程安全、内存模型、类加载等机制。所以下面就来分别从单例模式的实现方法和应用场景来介绍一下单例模式
一、单例模式介绍
1.1 单例模式是什么
单例模式也就是指在整个运行时域中,一个类只能有一个实例对象。
那么为什么要有单例模式呢?这是因为有的对象的创建和销毁开销比较大,比如数据库的连接对象。所以我们就可以使用单例模式来对这些对象进行复用,从而避免频繁创建对象而造成大量的资源开销。
1.2 单例模式的原则
为了到达单例这个全局唯一的访问点的效果,必须要让单例满足以下原则:
- 阻止类被通过常规方法实例化(私有构造方法)
- 保证实例对象的唯一性(以静态方法或者枚举返回实例)
- 保证在创建实例时的线程安全(确保多线程环境下实例只有一个)
- 对象不会被外界破坏(确保在有序列化、反序列化时不会重新构建对象)
二、单例模式的实现方式
关于单例模式的写法,网上归纳的已经有很多,但是感觉大多数只是列出了写法,不去解释为什么这样写的好处和原理。我偶然在B站看了寒食君归纳的单例模式总结思路还不错,故这里借鉴他的思路来分别说明这些单例模式的写法。
按照单例模式中是否线程安全、是否懒加载和能否被反射破坏可以分为以下的几类
2.1 懒加载
2.1.1 懒加载(线程不安全)
public class Singleton {
/**保证构造方法私有,不被外界类所创建**/
private Singleton() {}
/**初始化对象为null**/
private static Singleton instance = null;
public static Singleton getInstance() {
//判断是否被构造过,保证对象的唯一
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
从上面我们可以看到,通过public class Singleton
我们可以全局访问该类;通过私有化构造方法,能够避免该对象被外界类所创建;以及后面的getInstance
方法能够保证创建对象实例的唯一。
但是我们可以看到,这个实例不是在程序启动后就创建的,而是在第一次被调用后才真正的构建,所以这样的延迟加载也叫做懒加载。
然而我们发现g