2017-08-11 54 views
0
public class Foo 
{ 
    public int Count { get; set; } 
} 

public class FooHandler 
{ 
    private ConcurrentDictionary<string, Foo> FooHash = new ConcurrentDictionary<string, Foo>(); 

    public IncrementFoo(string key) 
    { 
     FooHash[key].Count++; 
    } 
} 

我可以用這種方式更新Foo條目的屬性嗎?它是否是線程安全的(即在此場景中獲取或設置索引器原子)?是否在ConcurrentDictionary線程安全中通過索引更新值的屬性?

+1

ConcurrentDirectory是線程安全的,不會讓你的Foo類的線程安全。事實並非如此,增加一個變量是不安全的。您至少需要使用Interlocked.Increment()來增加屬性的後備存儲,或鎖定。 –

+0

@HansPassant您不能在屬性上使用「互鎖」。 – Servy

回答

4

僅僅因爲你看到有一個ConcurrentDictionary其中包含你的對象不會使對象線程安全。它不僅使訪問字典線程安全中的對象,從MSDN:

表示可以由多個線程同時訪問鍵/值對的線程安全集合。

使對象的屬性訪問線程安全的,你需要鎖定的代碼段他們的內部按:

public class Foo 
{ 
    private Object obj; 
    public int Count 
    { 
     get 
     { 
      lock (obj) 
      { 
       //this section is thread safe 
      } 
     } 
     set 
     { 
      lock (obj) 
      { 
       //this section is thread safe 
      } 
     } 
    } 
}