type
status
date
slug
summary
tags
category
icon
password
AI summary
一、定义
单例模式是java中最简单的设计模式之一,属于创建型模式,提供了创建一个全局实例对象的最佳方式
二、示例:
模拟场景:
- 数据库的连接池不会反复创建
- spring中⼀个单例模式bean的⽣成和使⽤
- 在我们平常的代码中需要设置全局的的⼀些属性保存
三、7种单例模式的实现
0. 静态类使⽤
在不需要维持任何状态下,仅仅⽤于全局访问,这个使⽤使⽤
静态类的⽅式
更加⽅便1. 懒汉模式(线程不安全)
高并发的场景
下就会造成多个
同样的实例并存,从⽽没有达到单例
的要求2.饿汉式(线程安全)
饿汉式是线程安全的,但是它在一开始就被加载,如果是大的对象情况下,可能开始就占用了很大的
内存空间
3.懒汉式(线程安全)
此种模式虽然是安全的,但由于把锁加到⽅法上后,
所有的访问都因需要锁
占⽤导致资源的浪费4.使用类的内部类(线程安全)
使用类的静态内部类实现的单例模式,既保证了线程安全有保证了
懒加载
,同时不会因为加锁
的⽅式耗费性能
。5.双重校验锁(线程安全)
双重校验减少了实例的创建消耗,减小了
锁的力度
6.CAS(线程安全)
java并发库提供了很多原⼦类来⽀持并发访问的数据安全性;
AtomicInteger
、 AtomicBoolean
、 AtomicLong
、 AtomicReference
。AtomicReference
可以封装引⽤⼀个V实例,⽀持并发访问如上的单例⽅式就是使⽤了这样的⼀个特点。使⽤CAS的好处就是不需要使⽤传统的加锁⽅式保证线程安全,⽽是依赖于CAS的忙等算法,依赖于底层硬件的实现,来保证线程安全。相对于其他锁的实现没有线程的切换和阻塞也就没有了额外的开销,并且可以⽀持较⼤的并发性。
7.枚举单例(线程安全)
使⽤枚举的⽅式解决单例模式,此种⽅式可能是平时最少⽤到的,解决线程安全、⾃由串⾏化、单⼀实例
总结:
虽然只是⼀个很平常的单例模式,但在各种的实现上真的可以看到java的基本功的体现,这⾥包括了
懒汉、饿汉、线程是否安全、静态类、内部类、加锁、串⾏化
等等在平时的开发中如果可以确保此类是
全局可⽤不需要做懒加载
,那么直接创建并给外部调⽤即可。
但如果是很多的类,有些需要在⽤户触发⼀定的条件后(游戏关卡)才显示,那么⼀定要⽤懒加载
。
线程的安全上可以按需选择- 作者:IT小舟
- 链接:https://codegym.top/article/JAVA%E3%80%90%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%91%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。