class A
{
public static A a=new A();
private A()
}
很多线程同时调用 A.a是否能得到同一个对象(是否线程安全)

解决方案 »

  1.   

    是线程安全的,这由Framework来保证
      

  2.   

    你的代码有点问题,这样才对
    class A 

    public readonly static A a=new A(); 
    private A() {}
    }
      

  3.   

    sealed class A
    {
        public readonly static A a = new A();
        private A() { }
    }
      

  4.   

    最简单的多线程单例模式
    //使用.NET类型初始化机制实现多线程Singleton 模式
    class Singleton
    {
       //内联初始化
        public static readonly Singleton instance = new Singleton();    private Singleton() { }
    }
    等价于class Singleton
    {
        public static readonly Singleton instance;    static Singleton()
        {
    instance = new Singleton();
        }
        private Singleton() { }
    }缺点是构造函数无法传参
      

  5.   

    更标准的多线程Singleton 模式实现
    using System;public class Singleton
    {
        //volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值
        private static volatile Singleton instance = null;
        private static object lockHelper = new object(); //辅助器
        private Singleton() { }    public static Singleton GetInstance()
        {
    //这里double check
            if (instance == null)
            {
                lock (lockHelper)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
      

  6.   


    此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。
      

  7.   

    对任何自定义的类型,CLR 只保证类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的。但至于实例成员是否是线程安全,这就需要开发人员来保证。
      

  8.   


    要按照你这么说,那clr提供的单例就不是线程安全的。你肯定2者等价么?
      

  9.   

    肯定请参考 李建忠老师 WebCast的设计模式相关资料