单例模式集中实现方式
饿汉式:直接创建对象,不存在线程安全问题
- 直接实例化饿汉式
- 枚举式
- 静态代码块饿汉式(包含复杂实例化代码)
懒汉式:延迟创建对象
- 线程不安全
- 线程安全
- 双检模式
- 静态内部类
饿汉式
直接实例化饿汉式
1
2
3
4
5
6
7
8
9
10
public class Singleton1 {
private final static Singleton1 INSTANT = new Singleton1();
private Singleton1(){}
public static Singleton1 getInstance(){
return INSTANT;
}
}
枚举式
1
2
3
public enum Singleton2 {
INSTANT
}
静态代码块饿汉式(包含复杂实例化代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton3 {
private static Singleton3 INSTANCE ;
private Singleton3(){}
static {
INSTANCE = new Singleton3();
// 这里可以写一些创建的逻辑
}
public static Singleton3 getInstance(){
return INSTANCE;
}
}
懒汉式
线程不安全
1
2
3
4
5
6
7
8
9
10
11
12
13
public class SingleTon4 {
private static SingleTon4 INSTANCE;
private SingleTon4(){}
public static SingleTon4 getInstance(){
if (INSTANCE == null) {
INSTANCE = new SingleTon4();
}
return INSTANCE;
}
}
线程安全
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SingleTon5 {
private static SingleTon5 INSTANCE;
private SingleTon5(){}
public static SingleTon5 getInstance(){
synchronized (SingleTon5.class){
if (INSTANCE == null) {
INSTANCE = new SingleTon5();
}
}
return INSTANCE;
}
}
双检模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingleTon5 {
private static SingleTon5 INSTANCE;
private SingleTon5(){}
public static SingleTon5 getInstance(){
if (INSTANCE == null) {
synchronized (SingleTon5.class){
if (INSTANCE == null) {
INSTANCE = new SingleTon5();
}
}
}
return INSTANCE;
}
}
静态内部类
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton6 {
private Singleton6(){}
private static class Inner{
private final static Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6 getInstent(){
return Inner.INSTANCE;
}
}