耿腾的博客

常期望安定,还期望即兴。

0%

设计模式(一)

单例模式

一个单一的类,负责创建自己的对象,同时确保只有单个对象被创建。

单例模式三种最典型的懒加载单例写法:

双重检查锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Singleton {

// 定义为 volatile,防止指令重排序,导致未完成初始化的对象被使用
private static volatile Singleton INSTANCE = null;

public static Singleton getInstance() {
// 基于性能考量,第一次检查,避免每一次都加锁
if (INSTANCE == null) {
// 加锁
synchronized (Singleton1.class) {
// 检查这之前是否有其他线程已经获得过锁并初始化
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}

return INSTANCE;
}
}

静态内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton {

// 外部类被加载时,内部类还不会被加载
private static class SingletonHolder {
private final static Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
// 调用这里时,内部类被加载,实现初始化
// 由JVM保证只加载一次,线程安全
return SingletonHolder.INSTANCE;
}

private Singleton() {}
}

枚举

1
2
3
4
5
6
7
8
// 懒加载,线程安全,还可以防止反序列化
public enum Singleton {
INSTANCE;

public static Singleton getInstance() {
return Singleton.INSTANCE;
}
}