设计模式:Singleton
目录
[显示]
1.摘要
Singleton模式能保证系统运行时的某个类仅有一个实例,虽然模式思路很简单,但实现方法的不同有可能造成正确性或效率的问题,需要额外注意。
2. 针对问题
系统运行时的某个类仅有一个实例的情况。
3. 介绍
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
4. 实现
4.1. 单线程
一般Singleton的实现分为3部分。
1、隐藏构造函数
2、创建并保存实例
3、返回实例
例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Singleton { private static Singleton instance=null; public static Singleton getInstance() { if(instance==null) { instance=new Singleton(); } return instance; } private Singleton() { } } |
4.2. 多线程
多线程环境下,多个线程同时执行创建并保存实例有可能冲突并产生多个实例。
解决方法主要有三种:
1、线程同步,主要分为一次判断和二次判断
一次判断:判断语句包含在同步区域内,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Singleton { private static Singleton instance=null; public static Singleton getInstance() { synchronized(Singleton.class) { if(instance==null) { instance=new Singleton(); } } return instance; } private Singleton() { } } |
代码执行效率受同步影响较大。
二次判断:进入同步区域前进行一次判断,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Singleton { private static Singleton instance=null; public static Singleton getInstance() { if(instance==null) { synchronized(Singleton.class) { if(instance==null) { instance=new Singleton(); } } } return instance; } private Singleton() { } } |
曾经在网上看过一篇文章,讲二次判断仍然不能完全保证逻辑的正确性,但是一般情况下不会出现。
2、利用语言特性初始化,由编译器确定构造函数执行时间。
1 |
private static Singleton instance=new Singleton(); |
还有一些类似方法,函数内static变量赋值,放入static区,构造static类,构造enum项等,思路大致类似。构造函数执行时间较长时会拖慢程序载入速度。
3、手工初始化
进入多线程状态前预先进行初始化,可以与二次判断合用。
5. 特点
1、设计模式思路简单
2、实现方式多样,需要按需挑选合适方式。
6. 相关文章
7. 参考文章
- 《设计模式_可复用面向对象软件的基础》
- http://blog.csdn.net/hguisu/article/details/7505909
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,转载请注明作者及原网址。
抱歉,暂停评论。