浏览 2250 次
锁定老帖子 主题:单例模式(单件模式)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-29
单件模式,就是确保一个类只有一个实例,并提供一个全局访问点。
单例的作用是独一无二,比方说,如果有一个注册表设置的对象,你不希望这样的对象有多个拷贝吧,那会把设置搞得一团乱,利用像单例这样的单件对象,可以确保程序中使用的全局资源只有一份。 单件常常被用来管理共享资源,例如数据库连接或者线程池。 /** * @author zhq426 * */ public class Singleton { //利用一个静态变量来记录singleton 类的唯一实例 private static Singleton uniqueInstance; /** * 把构造器的声明为私有的,只有自singeton类内才可以构造器。 */ private Singleton(){ } /** * 用getInstance()方法实例化对象,并返回这个实例。 * @return */ public static Singleton getInstance(){ if(uniqueInstance==null){ uniqueInstance=new Singleton(); } return uniqueInstance; } public void test(){ System.out.println("test singleton"); } //other methods singleton 是一个正常的类, //具有一些其他用途的实例变量和方法。 } uniqueInstance 拥有“ 一个”实例,别忘记了,它是一个静态变量,如果uniqueInstance是空的,表示还没有创建实例,而如果不存在,我们就利用私有构造函数产生一个实例并把它赋值到静态变量中,请注意,如果我们不需要这个变量,它就永远不会产生。这就是“延迟”实例化。 以上说的是在单钱程时是不会产生多个实例的,如果在多线程呢??? 1. 只要把getInstance()变成同步(synchronized)方法,多线程灾难就可以轻易的解决了, 2. 使用多线程,使效率降低了,可以使用急切创建实例的,而不用延迟实例化的做法。改方法变成 private static Singleton uniqueInstance=new Singleton(); 3. 或者使用“双重检查加锁”,在getInstance()中减少使用同步。 if(uniqueInstance==null){ synchronized(Singleton.class){ if(uniqueInstance==null){ uniqueInstance=new Singleton(); } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |