RCI*_*CIX 17 .net c# locking thread-safety
在我看过的所有"线程安全"代码示例中,它们锁定了一个单独的虚拟对象.为什么不能直接对有问题的数据执行锁定?
Joã*_*elo 19
锁定单独的private虚拟对象可以保证没有其他人锁定该对象.
如果您锁定数据并且外部可以看到同一条数据,则会失去该保证.例如:
public class MyObject
{
public void SharedMethod()
{
lock (this)
{
// Do stuff
}
}
}
class Program
{
static void Main(string[] args)
{
MyObject o = new MyObject();
lock (o)
{
new Thread(() =>
{
// Gets blocked 2s because of external lock
o.SharedMethod();
}).Start();
Thread.Sleep(2000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Jeff Richter(CLR Via C#的作者)在本文中讨论了安全线程同步的原因.
具体来说,在那篇文章中,"为什么好主意不是那么好"这一部分回答了你的问题.
它实际上是CLR Via C#一书中的一章.
总之,将私有对象作为"synclock"对象允许您的类封装和控制您的类所需的任何锁定.因此,无论有多少客户端使用您的类,都会始终如一地正确执行锁定.
| 归档时间: |
|
| 查看次数: |
2453 次 |
| 最近记录: |