单例模式

昨天笔试考到了单例模式,现在重新总结一下吧。

一、什么是单例模式

  单例模式是一种对象创建型模式,使用单例模式,可以保证一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

  其实,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 }
查看代码
原文地址:https://www.cnblogs.com/bingoogol/p/DesignPattern-singleton.html