现在的位置: 首页 > 综合 > 正文

设计模式之单例模式

2019年04月10日 ⁄ 综合 ⁄ 共 1425字 ⁄ 字号 评论关闭

一、定义

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

单例类特点:

1、Java语言中单例类的一个重要的特点是类的构造方法是私有的,从而避免外界利用构造子直接创造出任意多的实例。

2、由于单例类的构造方法是私有的,因此该类不能被继承

3、自己创建自己的实例,并且自己向系统提供这一实例。

3、单例类局限于某一个JVM中。在分布式系统中有多个JVM,那么单例类在各个JVM都会有一个它的实例。

如果这个单例类是无状态的(及单例对象没有属性),则不会有影响。如果是有状态的单例类则会对系统照成影响,所以在使用了EJB、RMI和JINI技术的分布式系统中,应当避免使用有状态的单例模式。

使用条件:

在一个系统要求一个实例时才应当使用单例模式,如线程池,缓存池,日志。

二、实现

//实现,按需创建单例,同时保证多线程下能工作
public class Singleton{
   
   //The volatile keyword ensure that multiple threads handle the uniqueInstance variable correctly when it is being initialized to the Singleton instance
   /*
   Java语言规范中指出:为了获得最佳速度,允许多个线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
   */
   private volatile static Singleton uniqueInstance=null;

   private Singleton(){
   }
   
   public static Singleton getInstance() {
        if(uniqueInstance == null){
		   synchronized (Singleton.class){ //note we only synchronize the first time through!
		      if(uniqueInstance == null)   //once in the block,check again and if still null, create an instance
			     uniqueInstance=new Singleton();
		   }//end synchronized	   
		}//end if
			
	    return uniqueInstance;
   }//end getInstance()
   
   //other useful methods here
}//end class Singleton

synchronized关键字:必须处理好在多个线程同时首次引用此类时的访问限制的问题,特别是当单例类作物资源控制器在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。在这段时间内多线程可能会同时首次引用此类。

三、使用例子

1、回收站

在windows系统的回收站只能有一个实例,整个系统都使用这个唯一的实例,所以回收站是单例模式。

2、属性管理器

大多数系统都有一些配置文件,用于存储系统配置信息,这些配置信息是系统的一种“资源”,应当避免有多于一个的对象读写,因为配置信息的读取可能发生在很多地方,但是修改配置信息的对象就不知道发生在哪里,所以需要采用单例模式实现属性管理器。

抱歉!评论已关闭.