首页 新闻 会员 周边 捐助

单例模式线程安全问题

0
悬赏园豆:5 [已解决问题] 解决于 2016-11-15 09:38

看网上说的加双重锁检查!

private static readonly object _lock = new object();
private static volatile DbSession _instance = null;
private DbSession() { }
public static DbSession CreateInstance()
{
  if (_instance == null)
  {
    lock (_lock)
    {
      if (_instance == null)
      {
        _instance = new DbSession();
      }
    }
  }
  return _instance;
}

 

这样难道不是导致 多个线程都用同一个实例吗?这还叫线程安全?  搞不懂  求大神

Leo96的主页 Leo96 | 初学一级 | 园豆:166
提问于:2016-11-14 20:59
< >
分享
最佳答案
1

单例模式跟线程安全是两个概念:

单例保证一定范围(比如一个appdomain)内仅有一个实例。

线程安全是保证对共享变量有序修改,修改结果是可控制的。

单例在只有一个线程访问时无需加锁的,但如果用于多线程环境,就需要考虑线程安全。加锁可以保证某一时刻仅有一个线程可以访问共享变量,其它线程需要等待,直到解锁。

收获园豆:5
LightSmaile | 菜鸟二级 |园豆:249 | 2016-11-15 09:26
其他回答(2)
0

前提是DbSession已经是线程安全的

张小军 | 园豆:182 (初学一级) | 2016-11-14 22:03
1

你得先清楚单例是个什么意思才行。哥们。

单例,不就是全局共享一个实例嘛!

你这里所谓的线程安全,是指创建这个实例( new DbSession())这一步是线程安全的。

假如 new DbSession()。这个里面要对某一个文件进行独占访问。然后,你2个线程同时运行到 new DbSession()。不久出错了么。是不

czd890 | 园豆:14488 (专家六级) | 2016-11-14 23:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册