A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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。

3 个回复

倒序浏览
谢谢 很好
回复 使用道具 举报
  挺好的   
回复 使用道具 举报
面试都是懒汉式。大家都搞清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马