此代码线程是否安全?
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();
}
答案 0 :(得分:2)
不,这段代码不是线程安全的,因为你在返回实例对象时会锁定,但如果有其他线程设置变量值,则可以更改Val1
。
如果此Val1
没有改变,即它只设置一次,那么您的代码将是线程安全的,因为您只访问这些值。
编辑根据您编辑的问题和评论发布,您的代码将是线程安全的,因为Val1
仅在构造函数中初始化,并且由于lock (Sync)
语句而线程安全