以下代码线程是否安全

Max*_*ich 0 c# multithreading locking thread-safety

我有这样的课.

public abstract class HtmlObject<T>
{

    public HtmlObject() {}
    public HtmlObject(string id, string name, T value)
    {
        this.ID = id;
        this.Name = name;
        this.Value = value;
    }

    public string ID { get; set; }
    public string Name { get; set; }
    public T Value { get; set; }

    public abstract string Build();
}
Run Code Online (Sandbox Code Playgroud)

具体实现看起来像这样.

public class HtmlRadio : HtmlObject<string>
{
    private const string RadioHtml = "<input type='radio' name='{0}' value='{1}' {2} />{1}<br />";

    public bool Checked { get; set; }

    public override string Build()
    {
        if (this.Checked) 
            return string.Format(HtmlRadio.RadioHtml, this.Name, this.Value, "checked='checked'");
        else
            return string.Format(HtmlRadio.RadioHtml, this.Name, this.Value, string.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)

而我想知道的是,如果Build()跨线程进行调用将是安全的.我的假设是不会因为我接下来的一系列电话

HtmlRadio radio = new HtmlRadio();
radio.Checked = false;
//Something could happen here?
string result = radio.Build();
Run Code Online (Sandbox Code Playgroud)

我的理解是,radio.Checked它的设置和调用之间的价值可能会发生变化,这Build()是正确的吗?如果是这样的话,如果我愿意,我怎么能"修理"这个?

age*_*t-j 5

IHtmlRadio radio = new HtmlRadio();
radio.Checked = false;
//Something could happen here only if you give `radio` to another thread somehow.
string result = radio.Build();
Run Code Online (Sandbox Code Playgroud)

另一个线程能够访问radio吗?如果没有,那你就没事了.

另外,你害怕什么?如果选中从false更改为true或true更改为false,您真的关心吗?它不会爆炸 - 它将返回一个布尔值,而不是抛出异常.

编辑: 不,它不是编写的线程安全,另一个线程可以更改Checked,Value并且Name,没有任何一个以任何顺序受到任何保护.