单例模式

来源:互联网 发布:郑秀晶崔雪莉关系知乎 编辑:程序博客网 时间:2024/06/01 21:38

懒汉式

public class LHanDanli {      //定义一个私有类变量来存放单例,私有的目的是指外部无法直接获取这个变量,而要使用提供的公共方法来获取      private static LHanDanli dl = null;      //定义私有构造器,表示只在类内部使用,亦指单例的实例只能在单例类内部创建      private LHanDanli(){}      //定义一个公共的公开的方法来返回该类的实例,由于是懒汉式,需要在第一次使用时生成实例,所以为了线程安全,使用synchronized关键字来确保只会生成单例      public static synchronized LHanDanli getInstance(){          if(dl == null){              dl = new LHanDanli();         }         return dl;     } }
饿汉式

public class EHanDanli {      //此处定义类变量实例并直接实例化,在类加载的时候就完成了实例化并保存在类中      private static EHanDanli dl = new EHanDanli();     //定义无参构造器,用于单例实例      private EHanDanli(){}      //定义公开方法,返回已创建的单例      public static EHanDanli getInstance(){          return dl;      } }
双重加锁机制.在懒汉式实现单例模式的代码中,有使用synchronized关键字来同步获取实例,保证单例的唯一性,但是上面的代码在每一次执行时都要进行同步和判断,无疑会拖慢速度,使用双重加锁机制正好可以解决这个问题:

public class SLHanDanli {//这里的双重指的的双重判断      private static volatile SLHanDanli dl = null;      private SLHanDanli(){}      public static SLHanDanli getInstance(){          if(dl == null){              synchronized (SLHanDanli.class) {                  if(dl == null){                      dl = new SLHanDanli();                  }             }         }         return dl;     } }
静态内部类:(推荐)

 public class Singleton {       private static class SingletonHolder {       private static final Singleton INSTANCE = new Singleton();        }        private Singleton (){}      public static final Singleton getInstance() {            return SingletonHolder.INSTANCE;        }    }  //其实使用静态初始化器的方式会在类加载时创建类的实例,但是我们将实例的创建显式放置在静态内部类中,它会导致在外部类加载时不进行实例创建,这样就能实现我们的双重目的:延迟加载和线程安全。