学习设计模式--Singleton
2014-05-13 00:47 wiikii# 阅读(204) 评论(0) 编辑 收藏 举报意图:保证一个类只有一个实例,并提供一个访问它的合局访问点。
示例一:使用内部静态类的方式保存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将失效。