我有一个这样的课。
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()
之间发生变化,这是正确的吗?如果是这样的话,如果我愿意,我怎么能“修复”这个?
答案 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,您真的关心吗?它不会爆炸 - 它将返回一个布尔值,而不是抛出异常。
编辑:不,它写的不是线程安全的,另一个线程可以更改Checked
和Value
以及Name
,其中任何一个都不受保护以任何方式以任何顺序。
答案 1 :(得分:2)
通常,实例成员不设计为线程安全的。您的代码与.NET Framework中的大多数类一样不安全。
除非您的类专门针对与并发相关的场景(例如System.Collections.Concurrent
命名空间)而设计,否则您不必担心它的线程安全性;这只会导致过于复杂和低效的实施。在适用的情况下,线程访问的同步应由使用代码负责。