线程问题:双表——引入交叉引用

本文关键字:引用 双表 线程 问题 | 更新日期: 2023-09-27 18:17:25

我有两个在不同上下文中使用的不同对象的列表。每个列表由多个线程访问,这些线程可以添加,删除和更改列表中对象的状态。这两个列表都通过锁定列表来防止多次访问。这似乎很好。
现在有一个要求,为了读一个特定的属性(由不同的线程写),List1中的对象必须持有List2中对象的引用。
因此,尽管每个列表(以及因此包含的对象)都受到保护,不能进行多次访问,但现在一个线程可以写入List1 Object1。属性,而另一个线程正在通过List2 Object2.Object1.Property.
这种情况安全吗?(我不这么认为,但不是百分之百确定)。
如果不安全-什么是最好的方法,使其安全?

线程问题:双表——引入交叉引用

那么您应该直接对写入的对象应用锁。如果在修改"属性"之前锁定Object1,那么无论线程是否使用Object1,它都将工作。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

同时锁定你正在访问的对象是有意义的:

Object myObject = list.get(x);
lock(myObject){
// do stuff in here
}

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

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