gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:34 27 4
gpt4 key购买 nike

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

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)字段,只有你可以访问它们并且只有你可以在锁中使用它们。一旦该字段公开,您就失去了这种控制。是的,你仍然可以在你的类中控制这个字段周围的所有锁,但你不知道这个字段将如何被你的类的消费者使用,他们也可以使用它来锁定,从而导致死锁。

关于c# - 锁定机制的可变范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com