| 
 
| 本帖最后由 fxwb2005 于 2014-8-5 11:33 编辑 
 之前也看论坛里有童鞋提出这两者的特点和区别,而且懒汉式在面试中也经常会考到,看完视频总结了一下,希望对不知道的童鞋有所帮助。
 
 首先是饿汉式:
 
 复制代码class Single
{
     private static final Single s=new Single();
     private Single(){}
     public static Single getInstance()
    {
         return s;
     }
}
创建静态对象时final加不加无所谓,但老毕说加上更严谨那就加上吧,饿汉式是比较常用的单例模式。
 
 接下来是懒汉式:
 
 复制代码class Single {
       private ststic Single s=null;
       private Single(){}
       public ststic Single getInstance()
        {
      if(s==null){
         synchronized(Single.class){
          if(s==null)
           {
              s=new Single();
              return s;
           }
         }
        }
        }
}
懒汉式的特点是使用了延迟加载,饿汉式在类创建时就创建好了对象,但懒汉式只是声明了对象,在调用的时候才会创建对象实例,这样可以节省一些资源,但是懒汉式在多线程访问时会发生安全问题,有可能会创建出多个对象,这样就违背了单例模式的初衷,所以需要使用同步方法或者同步代码块来解决这个问题,但如果使用同步方法的话,每个线程进来都要判断一次锁,会对效率有一些影响,所以可以使用双重if判断和同步代码块来提高效率。
 提示:懒汉模式在声明对象时不可以加final,否则下面无法创建对象实例,因为单例模式使用的是静态方法,所以同步使用的锁不是this,而是该类所属的字节码文件对象。也就是:类名.class。
 | 
 |