设计模式之-创建型-单例模式
# 前言
单例模式确保这个类在内存中只会存在一个对象,而且自行实例化并向整个应用系统提供这个实例。常见的几种实现方式有以下几种:
- 懒汉模式
- 饿汉模式
- 双重检测锁
- 静态内部类
- 枚举类
# 懒汉模式
所谓的饿汉模式就是类加载时我们不初始化实例,等需要用时候再去构造实例对象并返回。
- 线程不安全
public static class SingleTon{
private static SingleTon singleTon = null;
private SingleTon(){
}
public static SingleTon getSingleTonInstance(){
if (singleTon == null){ // 线程不安全
singleTon = new SingleTon();
}
return singleTon;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
优点:懒加载
缺点:线程不安全,只能单线程下使用
- 线程安全
public static class SingleTon{
private static SingleTon singleTon = null;
private SingleTon(){
}
public static synchronized SingleTon getSingleTonInstance(){
if (singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
优点:保证了线程安全
缺点:效率低,每次获取实例都需要加锁。
# 饿汉模式
所谓的饿汉模式就是类加载时我们就初始化实例,需要用时候直接返回实例。
public static class SingleTon{
private static SingleTon singleTon = new SingleTon();
private SingleTon(){
}
public static SingleTon getSingleTonInstance(){
return singleTon;
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
优点:线程安全
缺点:没有懒加载,如果从未使用这个实例,则造成内存浪费。
# 双重检测锁
双重检测锁模式是在懒汉模式的基础上进行改进
public static class SingleTon{
private static SingleTon singleTon = null;
private SingleTon(){
}
public static SingleTon getSingleTonInstance(){
if (singleTon == null){
synchronized(singleTon){
// 双重检查,保证只会创建一次
if (singleTon == null){
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
优点: 懒加载,并且保证了线程安全,同时效率高,避免反复进行加锁同步
推荐使用
# 静态内部类
class Singleton {
// 构造器私有化
private Singleton() {}
/** 写一个静态内部类,静态内部类在Singleton类被装载时并不会立即实例化,
* 而是在需要实例化时,调用getInstance方法,才会装载SingleInstance类
*/
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
// 提供一个静态的公有方法,直接返回SingleInstance.INSTANCE
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
优点:
- 线程安全(类的静态属性只会在第一次加载类的时候初始化)、
- 利用静态内部类的特点实现延迟加载
- 效率高
推荐使用
# 枚举类
enum Singleton {
INSTANCE; // 属性
}
1
2
3
4
2
3
4
优点: 避免了多线程同步问题,而且还防止反序列化重新创建新的对象
推荐使用
最后更新时间: 2024/06/04, 22:06:23