none
线程安全的为题 RRS feed

  • 问题

  • public class MyClass { static private MyClass _Instance; static internal MyClass Instance { get { if (_Instance == null) { _Instance = new MyClass(); } return _Instance; } }

    // ...... }

    MyClass.Instance 在多线程的访问这个属性会不会引发什么异常?

    我有点担心在多线程的环境下,同时执行 _Instance = new MyClass(); 这个代码.会怎样...

    2012年6月14日 23:32

答案

  • 一般定义一个GetInstance()方法返回实例, 而不是用属性的Get方法.

    给_Instance加个同步锁

    public class MyClass { private static MyClass _Instance;

    private MyClass()

    {

    } internal static MyClass GetInstance() { lock (_Instance) { if (_Instance == null) { _Instance = new MyClass(); } return _Instance; } } }

    或者直接用这个代码

    public class MyClass { private static readonly MyClass _Instance = new MyClass();

    private MyClass()

    {

    } static internal MyClass GetInstance() { return _Instance; } }



    你必须非常努力,才能看起来毫不费力


    • 已编辑 Darren Fang 2012年6月15日 2:50
    • 已标记为答案 钱仔 2012年6月16日 21:52
    2012年6月15日 2:27
  • 一般定义一个GetInstance()方法返回实例, 而不是用属性的Get方法.

    给_Instance加个同步锁

        public class MyClass
        {
            private static MyClass _Instance;
    
            internal static MyClass GetInstance()
            {
                lock (_Instance)
                {
                    if (_Instance == null)
                    {
                        _Instance = new MyClass();
                    }
    
                    return _Instance;
                }
            }
        }

    或者直接用这个代码

        public class MyClass
        {
            private static readonly MyClass _Instance = new MyClass();
    
            static internal MyClass GetInstance()
            {
                return _Instance;
            }
        }


    你必须非常努力,才能看起来毫不费力

         如果是singleton的话,最好再加上private MyClass(){},阻止外界去实例化该类

    AndersTan

    • 已标记为答案 钱仔 2012年6月16日 21:52
    2012年6月15日 2:48
  • 补充:最好使用双重锁定(单例模式),而且我不建议直接用锁去锁住一个要初始化的实体,建议这样做:

    public class MyClass
        {
            private static MyClass _Instance=null;
            private static object obj = new object();
    
    	private MyClass()
    
    	{
    
    	}
            public static MyClass GetInstance()
            {
                    if (_Instance == null)
                    {
                      lock(obj)
                       {
                         if(_Instance==null)
                          {
                        _Instance = new MyClass();
                          }
                       }
                    }
    
                    return _Instance;
                }
            }
        }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处



    2012年6月15日 2:55
    版主

全部回复

  • 一般定义一个GetInstance()方法返回实例, 而不是用属性的Get方法.

    给_Instance加个同步锁

    public class MyClass { private static MyClass _Instance;

    private MyClass()

    {

    } internal static MyClass GetInstance() { lock (_Instance) { if (_Instance == null) { _Instance = new MyClass(); } return _Instance; } } }

    或者直接用这个代码

    public class MyClass { private static readonly MyClass _Instance = new MyClass();

    private MyClass()

    {

    } static internal MyClass GetInstance() { return _Instance; } }



    你必须非常努力,才能看起来毫不费力


    • 已编辑 Darren Fang 2012年6月15日 2:50
    • 已标记为答案 钱仔 2012年6月16日 21:52
    2012年6月15日 2:27
  • 一般定义一个GetInstance()方法返回实例, 而不是用属性的Get方法.

    给_Instance加个同步锁

        public class MyClass
        {
            private static MyClass _Instance;
    
            internal static MyClass GetInstance()
            {
                lock (_Instance)
                {
                    if (_Instance == null)
                    {
                        _Instance = new MyClass();
                    }
    
                    return _Instance;
                }
            }
        }

    或者直接用这个代码

        public class MyClass
        {
            private static readonly MyClass _Instance = new MyClass();
    
            static internal MyClass GetInstance()
            {
                return _Instance;
            }
        }


    你必须非常努力,才能看起来毫不费力

         如果是singleton的话,最好再加上private MyClass(){},阻止外界去实例化该类

    AndersTan

    • 已标记为答案 钱仔 2012年6月16日 21:52
    2012年6月15日 2:48
  • 一般定义一个GetInstance()方法返回实例, 而不是用属性的Get方法.

    给_Instance加个同步锁

        public class MyClass
        {
            private static MyClass _Instance;
    
            internal static MyClass GetInstance()
            {
                lock (_Instance)
                {
                    if (_Instance == null)
                    {
                        _Instance = new MyClass();
                    }
    
                    return _Instance;
                }
            }
        }

    或者直接用这个代码

        public class MyClass
        {
            private static readonly MyClass _Instance = new MyClass();
    
            static internal MyClass GetInstance()
            {
                return _Instance;
            }
        }


    你必须非常努力,才能看起来毫不费力

         如果是singleton的话,最好再加上private MyClass(){},阻止外界去实例化该类

    AndersTan


    嗯, 对

    你必须非常努力,才能看起来毫不费力

    2012年6月15日 2:51
  • 补充:最好使用双重锁定(单例模式),而且我不建议直接用锁去锁住一个要初始化的实体,建议这样做:

    public class MyClass
        {
            private static MyClass _Instance=null;
            private static object obj = new object();
    
    	private MyClass()
    
    	{
    
    	}
            public static MyClass GetInstance()
            {
                    if (_Instance == null)
                    {
                      lock(obj)
                       {
                         if(_Instance==null)
                          {
                        _Instance = new MyClass();
                          }
                       }
                    }
    
                    return _Instance;
                }
            }
        }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处



    2012年6月15日 2:55
    版主