线程问题:双重列表 - 介绍交叉引用

时间:2011-12-09 12:33:05

标签: c# multithreading list

我在不同的上下文中使用了2个不同对象的列表。每个列表都由多个线程访问,这些线程可以添加,删除和更改列表中对象的状态。通过锁定列表,可以保护这两个列表免受多次访问。多数民众赞成似乎很好 现在要求List1中的对象保存对List2中对象的引用,以便读取特定属性(由不同的线程获取WRITEN)。
因此,尽管每个列表(以及因此包含的对象)都受到多个访问的保护,但现在可以让一个线程写入List1 Object1.Property,而另一个线程通过List2 Object2.Object1.Property读取它。 这种情况是否安全? (我认为不是,但不是100%肯定) 如果不安全 - 什么是使其安全的最佳方式?

3 个答案:

答案 0 :(得分:1)

同样锁定您正在访问的对象是有意义的:

Object myObject = list.get(x);
lock(myObject){

// do stuff in here

}

答案 1 :(得分:1)

然后你应该直接在书面对象上应用一个锁。如果在修改“Property”之前锁定Object1,那么无论线程是使用Object1.Property还是Object2.Object1.Property,它都会起作用。

至于知道它是否在没有锁定的情况下是线程安全的,这取决于你的属性的类型,以及你如何修改它。读/写操作对32位长数据(例如int或引用)是线程安全的。但是您的操作可能需要多次读/写。

Object.IntProperty = 3; // Write-only on a 32bit value, thread-safe
Console.WriteLine(Object.IntProperty); // Read-only on a 32bit value, thread-safe
Object.IntProperty++; // Read + Write, not thread-safe. Requires locking

答案 2 :(得分:1)

这是不安全的,例如,如果您在foreach中迭代列表而其他线程添加或删除项目,则foreach将失败。

最简单的选择是将您的列表更改为SynchronizedCollection<T>。更多信息here