The docs不解释它。他们只会说应该锁定什么,不应该锁定什么。
从here开始,似乎所有线程都应该使用相同的对象来使锁工作。虽然从here开始,但这似乎是应该避免死锁的原因。
请记住,我可能误解了整个锁定问题,因为我只是asked a question关于如何“锁定”变量并得到对我来说似乎< / em>根本没有实现(除了锁定代码)。
答案 0 :(得分:4)
将锁视为&#34;说话棒&#34;在一些会议中使用的。拿着棍子的人都可以说话。任何想说话的人都必须等到发言者放弃棍子。
当一段代码获取对象的锁定时,在同一对象上请求锁定的任何其他代码必须等到原始代码释放锁定。
那你应该锁定哪个对象?这在很大程度上取决于背景。经验法则是您锁定一个对象,其他可能影响代码块的人也可以锁定。如果您要更新集合,则可以ICollection.SyncRoot
为例。
OP编辑(希望更正): &#34;任何想说话的人&#34; - 作为该棒的发言者&#34;。 (任何人都可以说话。) 至于问题中的第二个链接 - 它指的是一个锁等待一秒的问题,而第二个链是等待第一个。
答案 1 :(得分:3)
lock
。通过&#34;共享资源&#34;我指的是由多个线程访问的任何内容。
所有锁定都是:
如果可以将线程置于锁中并同时等待另一个锁定,然后等待第一个锁定,则会出现网格锁定情况。通常情况下,你没有“窝”#34;你的锁以避免这个问题。此外,对于性能,如果没有别的,你很少锁定相同的变量,除非你实际上有两个部分依赖于不同时执行的代码(如果它是这样可能是一个糟糕的设计:))
答案 2 :(得分:0)
锁定某些内容旨在保护共享内存。因此,您必须对要保护的特定元素使用相同的SyncRoot
...但是,假设您有3个需要保护的对象,并且它们没有任何关联:
A a = new A();
B b = new B();
C c = new C();
然后没有理由对所有3个使用相同的SyncRoot
。事实上,如果它们真的是分开的,那就没有效率了。