关于单例的一个疑问

zioc2014 2014-02-12 06:58:27

public class Singleton
{
private volatile static Singleton _instance = null;
private static readonly object lockHelper = new object();
private Singleton(){}
public static Singleton CreateInstance()
{
if(_instance == null)
{
lock(lockHelper)
{
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}

内层的if(_instance == null)为什么不删除?是为并发的安全考虑吗?
...全文
289 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
敌敌畏耶 2014-02-28
  • 打赏
  • 举报
回复
引用 楼主 zioc2014 的回复:

public class Singleton
{
    private volatile static Singleton _instance = null;
    private static readonly object lockHelper = new object();
    private Singleton(){}
    public static Singleton CreateInstance()
    {
        if(_instance == null)
        {
            lock(lockHelper)
            {
                if(_instance == null)
                     _instance = new Singleton();
            }
        }
        return _instance;
    }
}
内层的if(_instance == null)为什么不删除?是为并发的安全考虑吗?
是 至于为什么,多了解了解 多线程 为什么要用锁。。。。
夜色镇歌 2014-02-28
  • 打赏
  • 举报
回复
第一次执行的时候是null...
md5e 2014-02-28
  • 打赏
  • 举报
回复
外层的if是控件更多的人不能够访问lock 内层的if是锁定第一个人的访问
zioc2014 2014-02-28
  • 打赏
  • 举报
回复
引用 2 楼 BenBenBears 的回复:
A static field keeps whatever object it refers to forever or until the AppDomain that the types are loaded into is unloaded. 即使静态字段为null,GC也不会将其回收,直到程序结束。而内层的if(_instance == null)为什么不删除?,是为了保证一个类的实例在内存中始终保持唯一(Gof中的Singleton模式)。这种特殊的实现是线程安全的,因为CLR保证了静态变量的创建是线程安全的。
能更通俗点吗? 仔细想 还是没必要 因为外层已经判断了。。。道理上我觉得是需要2个if,第一个是有就不重新取了(也不锁了),直接拿去用,第二个是保证instance唯一。。。但始终觉得这2个if可以只写外面一个..
zioc2014 2014-02-28
  • 打赏
  • 举报
回复
引用 6 楼 claymore1114 的回复:
里面那个 是保证 只有一个Singleton 实例,加锁防并发。 第一个 null判断才是亮点,那是减少 线程使用lock,因为lock 耗资源。
你知道我是什么意思吗? 外面有了if,为什么里面还要有?
md5e 2014-02-13
  • 打赏
  • 举报
回复
第一个人使用时是没有实例化的,所以为null,第一个之后他就不是null了,无需再进行实例化(可以节省时间,提高效率,并保证所有对象调用的都是这一个入口),这就叫做单例
claymore1114 2014-02-13
  • 打赏
  • 举报
回复
里面那个 是保证 只有一个Singleton 实例,加锁防并发。 第一个 null判断才是亮点,那是减少 线程使用lock,因为lock 耗资源。
魂之挽歌来袭 2014-02-13
  • 打赏
  • 举报
回复
引用 4 楼 LargeSkyMensk 的回复:
我一直喜欢下面这种方式
public class Singleton 
{
   private static readonly Singleton instance=new Singleton();

   public static Singleton Instance{get{return instance;}}
}
这种方式并发的时候会出问题
largeskymengsk 2014-02-13
  • 打赏
  • 举报
回复
我一直喜欢下面这种方式
public class Singleton 
{
   private static readonly Singleton instance=new Singleton();

   public static Singleton Instance{get{return instance;}}
}
BenBenBears 2014-02-12
  • 打赏
  • 举报
回复
A static field keeps whatever object it refers to forever or until the AppDomain that the types are loaded into is unloaded. 即使静态字段为null,GC也不会将其回收,直到程序结束。而内层的if(_instance == null)为什么不删除?,是为了保证一个类的实例在内存中始终保持唯一(Gof中的Singleton模式)。这种特殊的实现是线程安全的,因为CLR保证了静态变量的创建是线程安全的。
cheng2005 2014-02-12
  • 打赏
  • 举报
回复
是 多回答一个字都是浪费

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧