设计模式——单件(单例)模式
2015-06-16 15:47
204 查看
单件模式确保程序中一个类最多只有一个实例。
单件模式提供访问该实例的全局点。
注意多线程问题,选择合适的实现方式。
使用多个类加载器,会导致单件模式失效。
第5版java之前,双重检查加锁方式会失效。
JVM1.2及之前版本,必须建立单件注册表,防止被垃圾回收器回收对象。
该方式简单高效,但是性能会有影响,如果需要频繁获取实例,该方式不适合。如果对性能没有考虑,可使用。
如果总是需要创建并使用单件实例,或者在创建和运行时负担不重可以使用该方式。
仅在第一次创建的时候同步代码块,减少使用同步的次数。
单件模式提供访问该实例的全局点。
注意多线程问题,选择合适的实现方式。
使用多个类加载器,会导致单件模式失效。
第5版java之前,双重检查加锁方式会失效。
JVM1.2及之前版本,必须建立单件注册表,防止被垃圾回收器回收对象。
方式一:同步方法
public class Singleton{ private static Singleton mInstance; // 构造函数私有化,禁止使用new的方式创建对象。 private Singleton() { } //同步方法,防止多线程同时进入该方法。 public static synchronized Singleton getInstance() { if (mInstance == null) { mInstance = new Singleton(); } return mInstance; } }
该方式简单高效,但是性能会有影响,如果需要频繁获取实例,该方式不适合。如果对性能没有考虑,可使用。
方式二:静态初始化创建
public class Singleton { //静态初始化器创建单件对象,保证线程安全。 private static Singleton mInstance = new Singleton(); // 构造函数私有化,禁止使用new的方式创建对象。 private Singleton() { } //已初始化,直接使用。 public static Singleton getInstance() { return mInstance; } }
如果总是需要创建并使用单件实例,或者在创建和运行时负担不重可以使用该方式。
方式三:双重检查加锁
public class Singleton { // 保证对象在主内存中 private volatile static Singleton mInstance; // 构造函数私有化 private Singleton() { } // 双重检查加锁 public static Singleton getInstance() { if (mInstance == null) { synchronized (Singleton.class) { if (mInstance == null) { mInstance = new Singleton(); } } } return mInstance; } }
仅在第一次创建的时候同步代码块,减少使用同步的次数。
相关文章推荐
- CAT 测试事件开关
- Storm Trident 资料聚合
- QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
- Python split()方法
- CSS学习1——基本布局以及盒子模型
- C# 操作 Excel 常见问题收集和整理
- RFS的web自动化验收测试——第15讲 RF结合Jenkins
- 处理IDOC的Funcaion Moudle
- 接口测试-自动化-Java实现-HtmlFile
- cygwin的下的gcc的一点体会。
- C#使用Parallel类进行多线程编程实例
- 蓝牙查寻的具体过程
- 逆波兰运算
- Android NDK开发介绍
- cygwin的下的gcc的一点体会。
- 判断手机号码格式的正则表达式
- centos 64bit 安装 redmine 记录
- 06-图5. 旅游规划(25)
- 排序算法
- UIApplication、UIView、UIWindow、UIScreen、UIViewController、UINavigationController 介绍