2017-08-11 1 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のスレッドセーフでindexの値をプロパティで更新していますか?

+1

ConcurrentDirectoryは、スレッドセーフである、あなたのFooクラスのスレッドセーフなことはありません。 。そして、そうではありません、変数をインクリメントすることは決して安全ではありません。少なくともInterlocked.Increment()が必要です。プロパティのバッキングストアを増やすか、ロックしてください。 –

+0

@HansPassantプロパティに 'Interlocked'を使うことはできません。 – 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 
      } 
     } 
    } 
} 
関連する問題