当前位置:  开发笔记 > 编程语言 > 正文

c#锁定

如何解决《c#锁定》经验,为你挑选了1个好方法。

我试图阻止多线程服务器中的数据争用.我的问题如下:有一个List,类型RServer是一个有几个字段的类.现在,服务器有几个线程全部同时运行,他们可以修改List(添加更多项)和单个RServer实例(更改字段).

因此,我的策略是readonly object RServerLock = new object( )在每个RServer实例中创建一个并且另外readonly object RServerListLock = new object( )包含所有修改Lista (或RServer实例)的代码lock.这样安全吗?如果一个线程试图锁定一个RServerLock 另一个锁定它会发生什么?



1> Jon Skeet..:

如果你有一个竞争锁,第二个线程必须等到第一个发布锁.

你的计划听起来几乎没问题 - 但是你也需要在读取数据时锁定,以确保获得最新的值和一致的值.否则你可能会在一个线程中编写一些值,并在一个不同的线程中同时看到一些新值 - 但可能不是全部 - 以及旧值.

如果你可以尽可能避免这样做,你的生活会更容易:)不可变的类型使线程更加简单.

不要忘记,如果您的代码需要同时需要两个锁(例如,添加一个RServer并以原子方式修改另一个),您必须确保始终以相同的顺序获取锁 - 如果一个线程试图获取当它持有锁A时锁定B,并且当它持有锁B时,另一个线程试图获取锁A,你最终会遇到死锁.

有关详细信息,请参阅我的线程教程或Joe Albahari's.此外,如果你对并发感兴趣,Joe Duffy有一本很好的书即将推出.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有