我试图阻止多线程服务器中的数据争用.我的问题如下:有一个List
,类型RServer
是一个有几个字段的类.现在,服务器有几个线程全部同时运行,他们可以修改List
(添加更多项)和单个RServer
实例(更改字段).
因此,我的策略是readonly object RServerLock = new object( )
在每个RServer
实例中创建一个并且另外readonly object RServerListLock = new object( )
包含所有修改List
a (或RServer
实例)的代码lock
.这样安全吗?如果一个线程试图锁定一个RServerLock
而另一个锁定它会发生什么?
如果你有一个竞争锁,第二个线程必须等到第一个发布锁.
你的计划听起来几乎没问题 - 但是你也需要在读取数据时锁定,以确保获得最新的值和一致的值.否则你可能会在一个线程中编写一些值,并在一个不同的线程中同时看到一些新值 - 但可能不是全部 - 以及旧值.
如果你可以尽可能避免这样做,你的生活会更容易:)不可变的类型使线程更加简单.
不要忘记,如果您的代码需要同时需要两个锁(例如,添加一个RServer并以原子方式修改另一个),您必须确保始终以相同的顺序获取锁 - 如果一个线程试图获取当它持有锁A时锁定B,并且当它持有锁B时,另一个线程试图获取锁A,你最终会遇到死锁.
有关详细信息,请参阅我的线程教程或Joe Albahari's.此外,如果你对并发感兴趣,Joe Duffy有一本很好的书即将推出.