我正在尝试防止多读取服务器中的数据争用。我的问题如下:有一个List<RServer>
,类型RServer
是一个具有多个字段的类。现在,服务器有多个线程同时运行,它们可以修改List
(添加更多项)和单个RServer
实例(更改字段)。
因此,我的策略是在每个readonly object RServerLock = new object( )
实例中分别创建一个RServer
和一个readonly object RServerListLock = new object( )
,并在List
中将所有修改了这两个代码的代码(RServer
或lock
实例)括起来。这样安全吗?如果一个线程试图锁定一个RServerLock
而另一个却锁定了它,会发生什么情况呢?
最佳答案
如果您有争用的锁,则第二个线程必须等待,直到第一个线程释放该锁。
您的计划听起来不错-但是在读取数据时也需要锁定,以确保获得最新的值和一致的值。否则,您可能会在一个线程中写入一些值的过程中途中途,并在不同的线程中同时看到一些新值-但可能不是全部-和旧值。
如果您可以避免这样做,那么您的生活将会变得更加轻松:)不可变的类型使线程处理变得更加简单。
不要忘记,如果您有同时需要两个锁的代码(例如,添加一个RServer并原子地修改另一个RServer),则必须确保始终以相同的顺序获取锁-如果一个线程试图获取锁B持有锁A时,另一个线程试图获取锁A时获得锁A,您最终将陷入死锁。
有关更多详细信息,请参见我的threading tutorial或Joe Albahari's。另外,如果您对并发感兴趣,Joe Duffy的excellent book即将发布。