转:再谈java单例模式[Singleton]之五种写法--双检索、枚举、线程问题

转自:http://hi.baidu.com/1039580989/blog/item/c65a1e5693c7f9d8b645ae0d.html

 

/**
 * 饿汉式单例类
 * @author wang
 */
public class Singleton {
 private Singleton(){}
 private static Singleton instance=new Singleton();
 private static Singleton getInstance(){
  return instance;
 }
}
此方法不用考虑线程同步 问题

/**
 * 懒汉式单例类
 * @author wang
 */
public class Singleton {
 private Singleton(){}
 private static Singleton instance;
 public static synchronized Singleton getInstance(){
  if(instance==null){
   return instance=new Singleton();
  }else{
   return instance;
  }
 }
}
为了线程同步问题,加上synchronized关键字 。但是效率会下降


/**
 * 内部类实现
 * @author wang
 */
public class Singleton_Holedr {
 private Singleton_Holedr(){}
 //内部类
 private static class  SingletonHoledrContainer{
  private static Singleton_Holedr instances=new Singleton_Holedr();
 }
 
 public static Singleton_Holedr getInstances(){
  return SingletonHoledrContainer.instances;
 }
}
上面程序强制初始化了SingletonHoledr类,但如果我们还不需要使用它的该类的唯一实例,
但系统不会初始化其实内部类 :SingletonHoledr
因此如果系统只有等到真正调用Singleton_Holedr的getInstances()方法时才会初始化 SingletonHoledrContainer类

/**
 * 双检索单例模式
 * @author wang
 */
public class Singleton_Lock {
 private Singleton_Lock(){}
 
 private static Singleton_Lock instances;
 private static Singleton_Lock getInstances(){
  if(instances==null){
   synchronized (Singleton_Lock.class) {//保证了同一时间只能有一个对象访问此同步块
    if(instances==null){
     instances=new Singleton_Lock();
    }
   } 
  }
  return instances; 
 }
}

/**
 *利用枚举单例模式
 */
public enum SingletonExample {
  INSTANCE; 
     public static SingletonExample getInstance(){ 
         return INSTANCE; 
     } 
}

你可能感兴趣的:(Singleton)