博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
singleton模式的一种变体:double-checked locking (转)
阅读量:2505 次
发布时间:2019-05-11

本文共 1059 字,大约阅读时间需要 3 分钟。

singleton模式的一种变体:double-checked locking (转)[@more@]singleton 的一种变体:double-checked locking
在单线程下,我们的singleton多半是这样( ):
class Singleton{
  private Singleton(){ //... };
  private static Singleton instance = null;
  public static Singleton getInstance
  {
    if ( instance == null )
      instance = new Singleton();
    return instance;
  };
  //...
  }
但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。
所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。
我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新 之前应该再检查一次instance==null:
class Singleton{
  //...
  private synchronized static void doSync(){
    //在这里同步
  }
  public Singleton getInstance(){
    if(instance==null){
      Singleton.doSync();
      if(instance==null)  // 再进行一次检查
        instance = new Singleton();
    }
    return instance;
  }
两次检查,既避免了 瓶颈,又避免了重复创建。这就是double-checked locking模式。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-1007851/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-1007851/

你可能感兴趣的文章
数组的示例
查看>>
java 循环变量
查看>>
Js获取日期时间及其它操作
查看>>
20141103
查看>>
HTML <hr> 标签定义和用法
查看>>
使用File查询出所有的文件和目录的信息
查看>>
.NET Micro Framework V4.2 QFE2新版本简介
查看>>
Vue.js学习笔记(2)vue-router
查看>>
python中函数和方法的区别
查看>>
(转载)java线程 - 线程唤醒后并被执行时,是在上次阻塞的代码行重新往下执行,而不是从头开始执行...
查看>>
【codeforces 483B】Friends and Presents
查看>>
【codeforces 767B】The Queue
查看>>
【codeforces 190C】STL
查看>>
041魔法方法:构造和析构
查看>>
7月/暑假集训总结1
查看>>
通悉IDC刘雨生带您查看BGP线路服务器的优势
查看>>
js在html中的三种写法
查看>>
数据切分——Atlas读写分离Mysql集群的搭建
查看>>
学习Learn Python The Hard Way 前言中的一段话,可与君共勉
查看>>
步步为营-79-缓存
查看>>