Skip to main content
 首页 » 编程设计

c#之锁定机制的可变范围

2024年02月01日33zhoujg

有人可以详细解释为什么被锁定的变量范围很重要吗? 例如:

lock(variable){ //do something here ! } 

在 msdn 中,它声明避免锁定公共(public)类型,最好锁定私有(private)或私有(private)静态类型。在锁定期间,实际被锁定的是什么?变量地址还是什么?

请您参考如下方法:

lock 接受 System.Object 类型的实例。 System.Object 的所有实例都在内存中包含一些用于同步目的的隐藏字段(我们称它为 ThreadId)。那么,当您用某个对象调用 lock 时会发生什么? lock 语句(实际上是Monitor.Enter 的语法糖)检查传递的对象是否有ThreadId 字段,如果有什么都没有,它在那里放了一些标识符(据我所知是当前线程的 ID),进入 lock 语句下的代码块,并在该 block 的末尾 - 重置 ThreadId 值。如果 ThreadId 字段不为空,它会停止并等待它变空。这样就保证了只有一个线程可以通过相同的传递对象访问被lock覆盖的代码段。

为什么不建议在lock中使用公共(public)属性/字段?使用锁,很容易造成死锁(当线程 A 等待线程 B 的某个操作时,线程 B 又等待线程 A 的操作)。因此,控制对同一对象的所有锁定非常重要。当你设计一些类时,你知道所有私有(private)字段,只有你可以访问它们并且只有你可以在锁中使用它们。一旦该字段公开,您就失去了这种控制。是的,你仍然可以在你的类中控制这个字段周围的所有锁,但你不知道这个字段将如何被你的类的消费者使用,他们也可以使用它来锁定,从而导致死锁。