我有以下情况:我有一个C#字典,它有一个int作为键(唯一ID)和一个自定义类作为值,例如Dictionary<int, CustomClass>
(它不是ConcurrentDictionary
)。它是线程安全的/是否有任何竞争条件,如果我产生多个线程,所有线程都在整个字典上的不同类属性上设置数据?在线程设置数据之前,已经完成了对字典的所有添加操作。
使用代码更新(稍微清楚一点):
class Foo {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
}
// Initialized with 100 entries - Keys: 0 to 99
Dictionary<int, Foo> dict = new Dictionary<int, Foo>();
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(() => {
for(int i = 0; i < dict.Count; i++) {
dict[i].Prop1 = "whatever";
}
}));
tasks.Add(Task.Factory.StartNew(() => {
for(int i = 0; i < dict.Count; i++) {
dict[i].Prop2 = "whatever";
}
}));
tasks.Add(Task.Factory.StartNew(() => {
for(int i = 0; i < dict.Count; i++) {
dict[i].Prop3 = "whatever";
}
}));
Task.WaitAll(tasks.ToArray());
答案 0 :(得分:0)
当两个或更多代码块访问同一资源时,会发生竞争条件,从而改变其状态,并且更改自身和/或这些块的行为取决于块自身的特定执行顺序。
因此,如果您的线程之间没有任何关于它们在同一资源上执行的依赖关系,那么您可以忽略它们是否同时访问它。
如果重要的是每个对它正在访问的属性进行“可见”更改,并且属性之间存在一些关于其值的依赖关系,例如,一个属性在分配时会影响某些属性的值另外,您必须同步对该属性的访问权。
答案 1 :(得分:-2)
如果不同的线程正在编辑同一对象的不同属性,那么它是安全的。如果您尝试从多个线程编辑同一对象上的相同属性,则会出现竞争条件。
这假设属性未引用共享状态,这是您的代码示例所示。