2012-06-07 225 views
0

我有這樣的一個類。以下代碼是否線程安全

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

究竟是什麼,你認爲「可能發生在這裏」? – Chris

+0

您在這裏有順序很重要的一系列操作。當命令*不重要時,線程是最好的。你將不得不做一些工作來確保'Build'在屬性被設置後才被調用......這就像是根本沒有對它進行線程化。 –

回答

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或false,那麼您真的關心嗎?它不會炸燬 - 它會返回一個布爾值,而不是拋出異常。

編輯:不,它不是線程安全的,寫的,另一個線程可能會改變CheckedValueName,其中沒有一個在任何順序任何方式得到保護。

+0

我想我假設我的這個對象的實例是跨多個線程全局聲明的。 PS:我可能不在乎,我也沒有看到這麼做的一個很好的理由,我純粹問過,因爲它的某些事情使我的興趣達到了頂峯,我無法回答。 –

+0

@Maxim,但這不是你在你的例子中顯示的,看起來廣播是在本地定義的,並且只能由同一個線程訪問。 – Polyfun

2

一般來說,實例成員是而不是設計爲線程安全的。您的代碼與.NET Framework中的大多數類一樣不安全。

除非你的類是專門爲併發相關的場景設計的(例如System.Collections.Concurrent命名空間),否則你不應該擔心使它成爲線程安全的;這隻會導致過度複雜和低效的實現。在適用的情況下,線程訪問的同步應該是消費代碼的責任。