单例设计模式

匿名 (未验证) 提交于 2019-12-03 00:22:01

一直对设计模式很模糊,虽然项目中运用到了,但是很难真正说清什么是设计模式。这一节主要讲的是单例设计模式


在一个类中只有一个类的实例(构造函数是私有的),这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。主要作用对象是:一个全局使用的类频繁地创建与销毁。

/**  * @author xieyong  * @description 单例设计模式---一个类只有一个实例  * @date 2018/5/29 16:58  * @modified by:  */ public class Singleton {      private static Singleton singleton;      //让构造函数为 private,这样该类就不会被实例化     private Singleton(){}     public static Singleton getInstance(){         if (null==singleton){             singleton=new Singleton();         }         return singleton;     } }

这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 

/**  * @author xieyong  * @description 单例设计模式---一个类只有一个实例  * @date 2018/5/29 16:58  * @modified by:  */ public class Singleton {      private static Singleton singleton;      //让构造函数为 private,这样该类就不会被实例化     private Singleton(){}     public static synchronized Singleton getInstance(){         if (null==singleton){             singleton=new Singleton();         }         return singleton;     } }

这种写法在getInstance()方法中加入了synchronized锁。能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是效率很低(因为锁),并且大多数情况下不需要同步。

/**  * @author xieyong  * @description 单例设计模式---一个类只有一个实例  * @date 2018/5/29 16:58  * @modified by:  */ public class Singleton {      private static Singleton singleton=new Singleton();      //让构造函数为 private,这样该类就不会被实例化     private Singleton(){}      public static synchronized Singleton getInstance(){         return singleton;     } }

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,这时候初始化instance显然没有达到lazy loading的效果。

/**  * @author xieyong  * @description 单例设计模式---一个类只有一个实例  * @date 2018/5/29 16:58  * @modified by:  */ public class Singleton {      private static Singleton singleton=null;      //让构造函数为 private,这样该类就不会被实例化     private Singleton(){}      static {        singleton=new Singleton();     }     public static synchronized Singleton getInstance(){         return singleton;     } }
文章来源: 单例设计模式
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!