我了解到,在向 C# 字典中添加、读取和删除元素时,它们并不支持多线程安全;但是,如果另一个线程正在写入、读取和从字典中删除元素,是否可以以线程安全的方式访问 C# 字典的 Count 属性呢?
我了解到,在向 C# 字典中添加、读取和删除元素时,它们并不支持多线程安全;但是,如果另一个线程正在写入、读取和从字典中删除元素,是否可以以线程安全的方式访问 C# 字典的 Count 属性呢?
由于属性在底层是一个方法调用,所以实际情况并不像乍一看那么简单。
因此,如果应用程序逻辑依赖于 Count
属性值,则理论上可能会出现竞态条件。
lock
来处理大部分问题,我想这应该可以解决。与其假设,我去反编译器里看了一下:
public int Count
{
get
{
// count and freeCount are local fields
return (this.count - this.freeCount);
}
}
是的,它是“线程安全”的,因为访问它不会导致字典对象损坏。话虽如此,如果另一个线程正在访问字典,我不确定是否可以想到任何使用情况,其中准确获取计数很重要。