设计模式 - Java中单例模式的6种写法及优缺点对比
1 为什么要用单例模式
1.1 什么是单例模式
1.2 单例模式的思路和优势
2 写法① - 饥饿模式
2.1 代码示例
2.2 优缺点比较
3 写法② - 懒惰模式
3.1 代码示例
3.2 优缺点比较
3.3 线程是否安全的测试
3.4 线程安全的懒惰模式
4 写法③ - 双重检查锁模式
4.1 代码示例
4.2 DCL存在的问题
4.3 解决方法
5 写法④ - 静态内部类实现单例
5.1 代码示例
5.2 静态内部类的优势
6 写法⑤ - 枚举类实现单例
6.1 代码示例
6.2 优缺点比较
7 写法⑥ - 通过ThreadLocal实现单例
8 扩展: JDK中的单例 以及 如何破坏单例模式
8.1 JDK中常见的单例模式
8.2 破坏单例模式的方法
9 扩展 - 性能对比
参考资料
版权声明
1 为什么要用单例模式
1.1 什么是单例模式
单例模式就是: 在程序运行期间, 某些类有且最多只有一个实例对象.
我们的应用中可能存在这样的需求: 某些类没有自己的状态, 在程序运行期间它们只需要有一个实例, 换句话说, 无论为这些类创建多少个实例, 对程序的运行状态、运行结果都不会产生影响.
更重要的一点是: 有些类如果存在两个或者两个以上的实例, 应用程序就会发生某些匪夷所思的错误, 不同于空指针、数组越界、非法参数等错误, 这样的问题一般都很难提前发觉和定位.
这个时候, 我们就应该把这样的类控制为单例结构 —— 确保程序运行期间最多只有一个相对应的实例对象.
关于类的状态的理解:
① 比如有一个 Person 类, 它有成员变量name、age等等, 不同的姓名和年龄就是不同的人, 也就是说这些变量都是不确定的, 这样的类就是有状态的类.
② 而像一些配置类, 比如 RedisProps (Redis的配置信息)类, 它的所有属性和方法都是static的, 没有不确定的属性, 这样的类就可以认为是没有状态的类.
—— 纯属个人看法, 若理解有误, 还请读者朋友们提出, 欢迎批评和交流