Java设计模式之单例(件)模式

单件模式
  在开发的过程中,有些时候只需要一个对象,如缓存,对话框,注册表,数据库连接或线程池等对象,为了确保在整个应用程序中能够保证该对象是唯一的,引入了单件模式。
      单件模式,确保一个类只有一个实例,并提供一个全局访问点。
   单件模式的一般组成:
   1)定义一个该类的private static变量,确保是创建一次
   2)设置其无参构造器为private
   3)提供一个全局访问点,即public static  返回该类的实例化。
      这种常规的做法,在单线程中可以使用,但是对于多线程就有可能会使类有多个对象了。
   常见单例模型:    
package com.whut.singleton;

public class SingletonObject {
  
   private static SingletonObject singleObject;
   private SingletonObject(){}
  
   public static SingletonObject getInstance()
  {
     if(singleObject== null)
      singleObject= new SingletonObject();
     return singleObject;
  }
}
   多线程的处理方法:
   1 同步getInstance()方法,利用synchronized来同步返回类的方法,该synchronized能保证每一个线程在进入这个方法之前,必须要等待别的线程离开,从而能保证不会有两个线程可以同时进入这个方法。同步一个方法,可能造成程序执行效率下降100倍,影响性能。
  
package com.whut.singleton;

public class SingletonObject {
  
   private static SingletonObject singleObject;
   private SingletonObject(){}
  
   public static  synchronized SingletonObject getInstance()
  {
     if(singleObject== null)
      singleObject= new SingletonObject();
     return singleObject;
  }
}
  2  急切创建实例方法。这种方法不用延迟实例化,一般是在应用程序中一定会使用该对象。由于在程序的应用中,类的加载过程,会先执行类的静态成员变量,所以就在类的静态成员变量中创建该对象,这样就能保证在该类的第一次加载的时候创建,以后就不会再次创建了。
  
package com.whut.singleton;

public class SingletonObject {
  
   private static SingletonObject singleObject = new SingletonObject();
   private SingletonObject(){}
  
   public static     synchronized SingletonObject getInstance()
  {
     return singleObject;
  }
}
  3 “双重检查枷锁”,在getInstance中减少使用同步。首先检查是否创建了实例,如果尚未创建,才进行同步,在同步内再次检查是否创建。这种可以减少同步等待的时间。
   
package com.whut.singleton;

public class SingletonObject {
  
   private volatile static SingletonObject singleObject;
   private SingletonObject(){}
  
   public static     synchronized SingletonObject getInstance()
  {
     if(singleObject== null)
    {
       synchronized(SingletonObject. class)
      {
         if(singleObject== null)
        {
          singleObject= new SingletonObject();
        }
      }
    }
     return singleObject;
  }
}

  不能继承单件类,因为单件类的构造器是私有的,而继承后的子类均需要调用该构造器,可是该构造器是私有的,则就不能继承,一旦改了构造器访问域,则就会使单件类受到破坏。

你可能感兴趣的:(java,单件模式,多线程处理)