首页 > 代码库 > 学习设计模式--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将失效。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。