昨天笔试考到了单例模式,现在重新总结一下吧。
一、什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
其实,gof对单例模式的定义是:保证一个类只有一个实例存在,同时提供能够对该实例加以访问的全局访问方法。
二、为什么要使用单例模式
在应用系统开发中,我们常常有一下需求:
1.在多个线程之间,比如servlet环境,共享统一个资源或者操作统一个对象
2.在整个程序空间使用全局变量,共享资源
3.大规模系统中,为了性能的考虑,需要节省对象的创建时间等。
因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。
三、单例模式实现
1.饿汉式
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
1 package com.bingoogol.designpattern.singleton;
2
3 /**
4 * 饿汉式
5 *
6 * @author bingoogol@sina.com
7 */
8 public class SingletonA {
9
10 private static SingletonA instance = new SingletonA();
11
12 /**
13 * 构造方法必须是私有的
14 */
15 private SingletonA() {
16 }
17
18 /**
19 * 提供能够对该实例加以访问的全局访问方法
20 * @return
21 */
22 public static SingletonA getInstance() {
23 return instance;
24 }
25 }
2.懒汉式
1 package com.bingoogol.designpattern.singleton;
2
3 /**
4 * 懒汉式
5 *
6 * @author bingoogol@sina.com
7 */
8 public class SingletonB {
9 private static SingletonB instance = null;
10
11 private SingletonB() {
12 }
13
14 //这种方式的坏处是,当有线程在占有该资源时,其他线程都必须在该方法外部等待
15 public static synchronized SingletonB getInstance() {
16 if (instance == null) {
17 instance = new SingletonB();
18 }
19 return instance;
20 }
21 }
3.双重检查
1 package com.bingoogol.designpattern.singleton;
2
3 /**
4 * 双重检测
5 *
6 * @author bingoogol@sina.com
7 */
8 public class SingletonC {
9 private static SingletonC instance = null;
10
11 private SingletonC() {
12 }
13
14 public static SingletonC getInstance() {
15 if (instance == null) {
16 // [1]
17 synchronized (SingletonC.class) {
18 if (instance == null) {
19 //线程一在此之前线程二到达了位置[1],如果此处不二次判断,那么线程二执行到这里的时候还会重新new
20 instance = new SingletonC();
21 }
22 }
23 }
24 return instance;
25 }
26 }