最近做项目碰到了一个初始化时候出错的问题
请问C#中的new操作,分配空间和初始化,是一个完整的原子操作吗?C#中使用double  check lock会出现线程不安全的问题吗?
以前只是听说过这种问题,以为不需要考虑的,想不到现在自己也遇到了...欢迎大家讨论,了解多线程初始化相关的东西也请提出来大家参考下,说不定哪天你也会遇到这样的问题哈

解决方案 »

  1.   

    DCL在C#里面没有问题,在C++里面用好了也OK,Java不行,是JVM的内存模型的问题。在.Net 4.0里面,你可以用Lazy<> 来实现Singleton等PS: 你的DCL(Double check locking)是为了实现SIngleton吗?
      

  2.   

    double checkif("")
    {
    lock()
    {
    if()
    {
    }
    }
    }
      

  3.   

    本人对设计模式概念模糊,刚上网查了下SIngleton,好像确实是这类问题
    比如:
    我初始化一个实例,a = new xx();然后马上接一句启动一个线程,这个线程需要访问初始化好的a,我发现其实这个线程访问的a,是没有完全初始化好的,导致了一些错误。我试过用线程延迟再访问的方法,貌似没问题了,但感觉影响性能,也不是规范的写法
    还有,我初始化一个a = new xx();其他线程也要判断,要是a=null,进行初始化,否者跳出,这里偶尔也会出问题。这应该就是所谓的用DCL实现SIngleton。这类东西,以前听说过,一直不在意,现在发现还是得注意的
    上网查了下,java里面DCL会引发线程安全的问题(具体原因谁来说一说?),但一直没人说C#里面是不是可以用DCL
    既然没问题,我就用咯
      

  4.   

    典型的线程安全的Singleton实现是使用double-checked locking的实现
    C# 与公共语言运行库也提供了一种"静态初始化"方法,这种方法不需要显式地编写线程安全代码
    using System;     
    public sealed class Singleton 
    {        
    private static volatile Singleton instance;        
    private static object syncRoot = new Object();         
    private Singleton() {}        
    public static Singleton Instance 
    {            
    get {                
    if (instance == null)                 
    { lock (syncRoot) {                      
    if (instance == null) instance = new Singleton();                  
       }                
    }                
    return instance;            
    }        
    }