Java单例模式学习笔记

发表于:2011-3-18 10:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:asdtiang    来源:51Testing软件测试网采编

分享:

  因此改变代码如下:

  • public class Singleton3 {  
  •  
  •     private static Singleton3 instance = null;  
  •     /** *//**  
  •      * 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次   
  •      * 使用时生成实例,提高了效率!  
  •      * 为了多线程不出错,加入了同步标志  
  •      * @return  
  •      */ 
  •     public static synchronized  Singleton3 getInstance() {      
  •         if (instance == null)  
  •             instance = new Singleton3();  
  •         return instance;  
  •     }  
  •  
  • }
  •   但这样又产生了一个问题,每次获取实例时方法都是同步的,显然性能很受影响的,所以继续更改代码如下:

      先记一下:volatile(网上抄的)

      volatile,用更低的代价替代同步

      为什么使用volatile比同步代价更低?

      同步的代价,主要由其覆盖范围决定,如果可以降低同步的覆盖范围,则可以大幅提升程序性能.

      而volatile的覆盖范围仅仅变量级别的。因此它的同步代价很低.

      volatile原理是什么?

      volatile的语义,其实是告诉处理器,不要将我放入工作内存,请直接在主存操作我.(工作内存详见java内存模型)

      因此,当多核或多线程在访问该变量时,都将直接操作主存,这从本质上,做到了变量共享。

      volatile的有什么优势?

      1、更大的程序吞吐量

      2、更少的代码实现多线程

      3、程序的伸缩性较好

      4、比较好理解,无需太高的学习成本

      volatile有什么劣势?

      1、容易出问题

      2、比较难设计

      volatile使用jdk要求1.5版本及1.5以上。

      改进后的代码如下(又叫双重加锁):

  • public class Singleton4 {  
  •    private static volatile Singleton4 instance;  
  •     /** *//**  
  •      * 双重加锁实现多线程运用和性能优化  
  •      * @return  
  •      */ 
  •     public static Singleton4 getInstance()  
  •     {  
  •       if (instance == null)  
  •       {  
  •         synchronized(Singleton4.class) {  //1  
  •           if (instance == null)          //2  
  •             instance = new Singleton4();  //3  
  •         }  
  •       }  
  •       return instance;  
  •     }  
  • }
  •   参考自第联网和head first设计模式。

    22/2<12
    100家互联网大公司java笔试题汇总,填问卷领取~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号