设计模式之-单例模式

单个实例

保证程序中只有一个实例

/*
* 饿汉式
 类加载到内存中,实例化一个单例,jvm保证线程安全
 简单实用,推荐使用
 
 Class.forName("")
 唯一缺点: 不管用到与否,类装载时就完成实例化 (不用装载他干啥?)
*/
public class Mg01{
  private static final Mg01 INSTANCE= new Mg01();
  
  private Mg01(){}
  
  public static Mg01 getInstance(){
    return INSTANCE;
  }
}

/**
lazy loading
	懒汉式
	不安全
*/
public class Mg03{
  private static Mgr03 INSTANCE;
  private Mg03(){}
  public static Mr03 getInstance(){
    if(INSTANCE == NULL){
      INSTANCE = new Mg03();
    }
    return INSTANCE;
  }
}

//加锁  没问题 但是颗粒度太大
public class Mg03{
  private static Mgr03 INSTANCE;
  private Mg03(){}
  public static synchronized Mr03 getInstance(){
    if(INSTANCE == NULL){
      INSTANCE = new Mg03();
    }
    return INSTANCE;
  }
}

/**
颗粒度小了  但是又出现 现场安全问题
*/
public class Mg03{
  private static Mgr03 INSTANCE;
  private Mg03(){}
  public static Mr03 getInstance(){
    if(INSTANCE == NULL){
      synchronized(mg03.class){
        INSTANCE = new Mg03();
      }
    }
    return INSTANCE;
  }
}

/**
	双重检测 DCL   完美
*/
public class Mg03{
  //volatile  加上 不然会有指令重排问题
  private static volatile Mgr03 INSTANCE;
  private Mg03(){}
  public static Mr03 getInstance(){
    if(INSTANCE == NULL){
      synchronized(mg03.class){
        	if(INSTANCE == NULL){
           		INSTANCE = new Mg03();
          }
      }
    }
    return INSTANCE;
  }
}



//完美 另一种  静态内部类
public class Mg04{
  private Mg04(){}
  
  private static class Mg04Holder{
    private final static Mg04 instance = new Mg04();
  }
  
  public static Mg04 getInstatnce(){
    return Mg04Holder.instance;
  }
  
}

//枚举单例  最完美的
// 不仅可以解决线程同步,还可以防止反序列化
// 防止反序列化   完美的 原因是  枚举类没有构造方法

public enum Mg05{
  INSTANCE;
  public void m(){}
}

//语法上最完美 枚举单例

相关推荐