我正在尝试防止多读取服务器中的数据争用。我的问题如下:有一个List<RServer>,类型RServer是一个具有多个字段的类。现在,服务器有多个线程同时运行,它们可以修改List(添加更多项)和单个RServer实例(更改字段)。

因此,我的策略是在每个readonly object RServerLock = new object( )实例中分别创建一个RServer和一个readonly object RServerListLock = new object( ),并在List中将所有修改了这两个代码的代码(RServerlock实例)括起来。这样安全吗?如果一个线程试图锁定一个RServerLock而另一个却锁定了它,会发生什么情况呢?

最佳答案

如果您有争用的锁,则第二个线程必须等待,直到第一个线程释放该锁。

您的计划听起来不错-但是在读取数据时也需要锁定,以确保获得最新的值和一致的值。否则,您可能会在一个线程中写入一些值的过程中途中途,并在不同的线程中同时看到一些新值-但可能不是全部-和旧值。

如果您可以避免这样做,那么您的生活将会变得更加轻松:)不可变的类型使线程处理变得更加简单。

不要忘记,如果您有同时需要两个锁的代码(例如,添加一个RServer并原子地修改另一个RServer),则必须确保始终以相同的顺序获取锁-如果一个线程试图获取锁B持有锁A时,另一个线程试图获取锁A时获得锁A,您最终将陷入死锁。

有关更多详细信息,请参见我的threading tutorialJoe Albahari's。另外,如果您对并发感兴趣,Joe Duffy的excellent book即将发布。

09-16 15:19