singleton

多线程安全的单例模式

某类只能有一个对象,构造函数为 private,通过静态成员变量和函数获得变量

模式1

类加载的时候直接 new 出静态对象,无法懒加载,降低内存的使用率

1
2
3
4
5
6
7
8
9
10
public class Singleton {
// 直接初始化一个实例对象
private static Singleton instance = new Singleton();
// 私有构造方法保证其他类对象不能直接 new 该对象的实例
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}

模式2

多线程创建实例,一个时刻只能有一个线程得到同步锁,但是,每次通过 getInstance 方法得到 singleton 实例都要获得锁,但是只有第一次创建锁才有意义,加锁是很耗时的操作

1
2
3
4
5
6
7
8
9
10
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

模式3

只有当 instance 为 null 时,才需要加锁,也只需创建一次实例,以后则无需加锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
// 先判断实例是否初始化
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

模式4

私有内部类;不用加锁

1
2
3
4
5
6
7
8
9
public class Singleton {
private Singleton() {}
private static class Inner {
private static Singleton s = new Singleton();
}
public static Singleton getSingle() {
return Inner.s;
}
}
您的支持鼓励我继续创作!