关闭

双重检查锁定失败可能性

发表于:2011-9-05 09:28

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

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

  双重检查锁定在延迟初始化的单例模式中见得比较多(单例模式实现方式很多,这里为说明双重检查锁定问题,只选取这一种方式),先来看一个版本:

  • public class Singleton {  
  •     private static Singleton instance = null;  
  •     private Singleton(){}  
  •       
  •     public static Singleton  getInstance() {  
  •        if(instance == null) {  
  •            instance = new Singleton();  
  •        }  
  •        return instance;  
  •     }  
  • }
  •   上面是最原始的模式,一眼就可以看出,在多线程环境下,可能会产生多个Singleton实例,于是有了其同步的版本:

  • public class Singleton {  
  •     private static Singleton instance = null;  
  •     private Singleton(){}  
  •       
  •     public synchronized static Singleton getInstance() {  
  •        if(instance == null) {  
  •            instance = new Singleton();  
  •        }  
  •        return instance;  
  •     }  
  • }
  •   在这个版本中,每次调用getInstance都需要取得Singleton.class上的锁,然而该锁只是在开始构建Singleton 对象的时候才是必要的,后续的多线程访问,效率会降低,于是有了接下来的版本:

  • public class Singleton {  
  •     private static Singleton instance = null;  
  •     private Singleton(){}  
  •       
  •     public static Singleton getInstance() {  
  •        if(instance == null) {  
  •            synchronized(Singleton.class) {  
  •               if(instance == null) {  
  •                   instance = new Singleton();  
  •               }  
  •            }  
  •        }  
  •        return instance;  
  •     }  
  • }
  • 21/212>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

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

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

    沪ICP备05003035号

    沪公网安备 31010102002173号