首页 > 代码库 > 学习设计模式--Singleton

学习设计模式--Singleton

意图:保证一个类只有一个实例,并提供一个访问它的合局访问点。

 

示例一:使用内部静态类的方式保存INSTANCE

 1 /**
 2  * Created by wiikii on 14-5-12.
 3  */
 4 public class Singleton implements Serializable {
 5 
 6     // 使用静态内部类保存INSTANCE
 7     private static class SingletonHolder {
 8         private static final Singleton _INSTANCE = new Singleton();
 9     }
10 
11     // 私有化构造函数  private or protected?
12     private Singleton() {}
13 
14     // 对外接口,获取唯一实例句柄
15     public static Singleton Instance() {
16         return SingletonHolder._INSTANCE;
17     }
18 
19     // readResolve方法应对单例对象被序列化时候
20     private Object readResolve() {
21         return Instance();
22     }
23 }

 

示例二:使用synchronized来保证线程同步。

 1 /**
 2  * Created by wiikii on 14-5-12.
 3  */
 4 public class Singleton implements Serializable {
 5 
 6     private volatile static Singleton _INSTANCE;
 7 
 8     private Singleton() {}
 9 
10     public static Singleton Instance() {
11         if (_INSTANCE == null) {
12             synchronized (Singleton.class) {
13                 if (_INSTANCE == null) {
14                     _INSTANCE = new Singleton();
15                 }
16             }
17         }
18         return _INSTANCE;
19     }
20 }

 

注:

volatile 表示易失变量,主要用于多线程中。   
为了提高效率,线程会将某变量(A)拷贝一份(B)到内存,线程对变量的访问实际访问的是(B),只是在某些特定的操作后,才会同步(A)与(B);因此有可能会存在(A)与(B)不一致的情况。使用volatile修饰的变量,就是告诉JVM不需要变量(A)的拷贝。
如果volatile关键字用于声明简单数据类型(如 int, boolean 等),那么对这些变量的操作将会是原子级别的;但是,如果当变量的值由自身的上一个值决定时,volatile将失效。