0%

单例模式

一、单例模式:

单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

1.1 饿汉式

1
2
3
4
5
6
7
8
9
10
public class Singleton {
private static Singleton singleton = new Singleton();

private Singleton() {
}

public static Singleton getInstance() {
return singleton;
}
}

1.2 重量级锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton {
private static Singleton singleton;

private Singleton() {
}

public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}

1.3 双重锁检查

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

private static volatile Singleton singleton;

private Singleton() {
}

//只有创建的时候需要获取锁,后面再使用就省去了锁的开销
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}

1.4 静态内部类方式

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

private Singleton() {
}

//只有使用的时候才会加载该类,并且由jvm保证线程安全性
private static class SingletonHolder {
public static final Singleton singleton = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.singleton;
}

}

1.5 枚举类

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

}

private enum SingletonEm {
INSTANCE;

private final Singleton instance;

SingletonEm() {
instance = new Singleton();
}

public Singleton getInstance() {
return instance;
}
}

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