2017-08-11 35 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 
      } 
     } 
    } 
}