单例模式(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。
例1:最常用的单例模式
1 public class SingleDemo {
2
3 // 在类加载的同时已经创建好一个静态对象,调用时反应速度快
4 // 资源利用率不高
5 private static SingleDemo obj = new SingleDemo();
6
7 // 私有构造函数
8 private SingleDemo (){
9 }
10
11 public static SingleDemo getInstance() {
12 return obj;
13 }
14 }
2
3 // 在类加载的同时已经创建好一个静态对象,调用时反应速度快
4 // 资源利用率不高
5 private static SingleDemo obj = new SingleDemo();
6
7 // 私有构造函数
8 private SingleDemo (){
9 }
10
11 public static SingleDemo getInstance() {
12 return obj;
13 }
14 }
例2:资源利用率高的单例
1 public class SingleDemo {
2
3 // 私有构造函数
4 private SingleDemo (){}
5
6 // 静态内部类
7 // 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法
8 public static class SingleFactory {
9 public static SingleDemo obj = new SingleDemo();
10 }
11
12 public static SingleDemo getInstance() {
13 return SingleFactory.obj;
14 }
15 }
2
3 // 私有构造函数
4 private SingleDemo (){}
5
6 // 静态内部类
7 // 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法
8 public static class SingleFactory {
9 public static SingleDemo obj = new SingleDemo();
10 }
11
12 public static SingleDemo getInstance() {
13 return SingleFactory.obj;
14 }
15 }
例3:不推荐使用的单例
1 public class SingleDemo {
2
3 // 对象实例
4 private static SingleDemo obj;
5
6 // 私有构造函数
7 private SingleDemo (){}
8
9 // 获得该类的一个实例,多线程的场合,要考虑排它锁
10 // 可以对该方法加锁,也可以对该实例加锁
11 // 加锁,能够保证在同一时刻最多只有一个线程执行该段代码。
12 // 对该方法加锁的话,可能会影响系统的并发效率,增加系统开销
13 public static synchronized SingleDemo getInstance() {
14
15 if (obj == null) {
16 obj = new SingleDemo();
17 return obj;
18 }
19 return obj;
20 }
21
22 // 对该实例加锁的例子
23 // 不推荐使用,在obj分配内存但还未初始化的时候,容易出错
24 public static SingleDemo getInstance2() {
25
26 if (obj == null) {
27 synchronized (obj) {
28 if (obj == null) {
29 obj = new SingleDemo();
30 }
31 }
32 }
33 return obj;
34 }
35 }
2
3 // 对象实例
4 private static SingleDemo obj;
5
6 // 私有构造函数
7 private SingleDemo (){}
8
9 // 获得该类的一个实例,多线程的场合,要考虑排它锁
10 // 可以对该方法加锁,也可以对该实例加锁
11 // 加锁,能够保证在同一时刻最多只有一个线程执行该段代码。
12 // 对该方法加锁的话,可能会影响系统的并发效率,增加系统开销
13 public static synchronized SingleDemo getInstance() {
14
15 if (obj == null) {
16 obj = new SingleDemo();
17 return obj;
18 }
19 return obj;
20 }
21
22 // 对该实例加锁的例子
23 // 不推荐使用,在obj分配内存但还未初始化的时候,容易出错
24 public static SingleDemo getInstance2() {
25
26 if (obj == null) {
27 synchronized (obj) {
28 if (obj == null) {
29 obj = new SingleDemo();
30 }
31 }
32 }
33 return obj;
34 }
35 }