浅析单例模式的几种实现方式

单例模式的几个必要点:

1.构造函数不对外开放,修饰符为private

2.通过静态方法返回单例对象

3.确保类对象有且只有一个,尤其在多线程下

4.确保类对象在反序列化时不会重新构建对象

 

饿汉模式:

主要通过static final 来保证类对象只有一个

 

懒汉模式:

public class LanHan(){
 private Lanhan lanHan;
   private LanHan(){}
   public static synchronized LanHan getInstance(){
   if(lanHan==null){
     lanHan=new LanHan();
   }
    return lanHan;
   }
}

缺点:第一次加载需要时间进行实例化  问题:每次getInstance需要做同步锁操作

 

Double Check Lock:

public class DCL(){
 private volatile static DCL dcl=null;
   private DCL(){}
   public static LanHan getInstance(){
   if(dcl==null){
      synchronized(DCL.class){
       if(dcl==null){
        dcl=new DCL();
        }
     }
     return lanHan;
   }
}

第一次判空,是为了有类实例时不做同步锁操作。  第二次判空,是判断对象为空时才去实例化。加volatile确保是每次对象是从主内存读取,防止对象还没初始化完全就被另外线程取走。

 

 

静态内部类单例模式:

public class SingleTon {
  private SingleTon(){}
  public static getInstance(){
   return SingleTonHolder.instance;
  }
  private static class SingleTonHolder{
  private static final SingleTon instance=new SingleTon();
  }
}

静态内部类只会在第一次getInstance时去加载内部类,且只会加载一次

 

还有通过枚举和容器构造单例,用的不多,就不写了。

 

单例的优缺点:单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

但是单例模式没有接口,扩展很困难。特别要注意单例对象如果持有Context,那么容易引发内存泄漏,此时需要注意传递给单例对象的context,最好是Application Contex

posted @ 2017-04-05 11:01  剑骨鱼  阅读(1015)  评论(0)    收藏  举报