以下代码线程是否安全

时间:2012-06-07 15:51:24

标签: c# multithreading thread-safety locking

我有一个这样的课。

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();
}

具体实现如下所示。

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);
    }
}

我想知道的是,如果跨越线程调用Build()是否安全。我的假设是不会因为我接受以下一系列电话

HtmlRadio radio = new HtmlRadio();
radio.Checked = false;
//Something could happen here?
string result = radio.Build();

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

2 个答案:

答案 0 :(得分: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();

另一个主题是否能够访问radio?如果没有,那你就没事了。

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

编辑:不,它写的不是线程安全的,另一个线程可以更改CheckedValue以及Name,其中任何一个都不受保护以任何方式以任何顺序。

答案 1 :(得分:2)

通常,实例成员设计为线程安全的。您的代码与.NET Framework中的大多数类一样不安全。

除非您的类专门针对与并发相关的场景(例如System.Collections.Concurrent命名空间)而设计,否则您不必担心它的线程安全性;这只会导致过于复杂和低效的实施。在适用的情况下,线程访问的同步应由使用代码负责。