这段代码线程安全吗? (对对象字段的共享访问)

时间:2013-12-31 06:16:16

标签: c# .net multithreading thread-safety

此代码线程是否安全?

class Program
{
    public class Settings
    {
        public string Val1 { get; set; }

        Settings()
        {
            // load Val1 and other props from the file using XmlSerializer
        }

        private static Settings _instance;
        private static readonly object Sync = new object();

        public static Settings Instance
        {
            get
            {
                lock (Sync)
                {
                    return _instance ?? (_instance = new Settings());
                }
            }
        }
    }

    static void Main(string[] args)
    {
        Trace.WriteLine(Settings.Instance.Val1);

        var thread = new Thread(
            state =>
            {
                Trace.WriteLine(Settings.Instance.Val1);
            });
        thread.Start();

        thread.Join();
    }

1 个答案:

答案 0 :(得分:2)

不,这段代码不是线程安全的,因为你在返回实例对象时会锁定,但如果有其他线程设置变量值,则可以更改Val1
如果此Val1没有改变,即它只设置一次,那么您的代码将是线程安全的,因为您只访问这些值。

编辑根据您编辑的问题和评论发布,您的代码将是线程安全的,因为Val1仅在构造函数中初始化,并且由于lock (Sync)语句而线程安全