黑马程序员技术交流社区

标题: 【资源分享】关于单例模式饿汉式与懒汉式的总结 [打印本页]

作者: fxwb2005    时间: 2014-8-5 10:43
标题: 【资源分享】关于单例模式饿汉式与懒汉式的总结
本帖最后由 fxwb2005 于 2014-8-5 11:33 编辑

之前也看论坛里有童鞋提出这两者的特点和区别,而且懒汉式在面试中也经常会考到,看完视频总结了一下,希望对不知道的童鞋有所帮助。

首先是饿汉式:
  1. class Single
  2. {
  3.      private static final Single s=new Single();
  4.      private Single(){}
  5.      public static Single getInstance()
  6.     {
  7.          return s;
  8.      }
  9. }
复制代码

创建静态对象时final加不加无所谓,但老毕说加上更严谨那就加上吧,饿汉式是比较常用的单例模式。

接下来是懒汉式:
  1. class Single {
  2.        private ststic Single s=null;
  3.        private Single(){}
  4.        public ststic Single getInstance()
  5.         {
  6.       if(s==null){
  7.          synchronized(Single.class){
  8.           if(s==null)
  9.            {
  10.               s=new Single();
  11.               return s;
  12.            }
  13.          }
  14.         }
  15.         }
  16. }
复制代码

懒汉式的特点是使用了延迟加载,饿汉式在类创建时就创建好了对象,但懒汉式只是声明了对象,在调用的时候才会创建对象实例,这样可以节省一些资源,但是懒汉式在多线程访问时会发生安全问题,有可能会创建出多个对象,这样就违背了单例模式的初衷,所以需要使用同步方法或者同步代码块来解决这个问题,但如果使用同步方法的话,每个线程进来都要判断一次锁,会对效率有一些影响,所以可以使用双重if判断和同步代码块来提高效率。
提示:懒汉模式在声明对象时不可以加final,否则下面无法创建对象实例,因为单例模式使用的是静态方法,所以同步使用的锁不是this,而是该类所属的字节码文件对象。也就是:类名.class。
作者: 王洪涛    时间: 2014-8-5 15:50
谢谢 很好
作者: .Mч┞尛__洋    时间: 2014-8-5 20:52
  挺好的   
作者: 文盲庄稼汉    时间: 2014-8-5 20:55
面试都是懒汉式。大家都搞清楚




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2