lock(变量) - 变量的冲突解释

时间:2014-06-23 20:28:31

标签: c# .net multithreading

The docs不解释它。他们只会说应该锁定什么,不应该锁定什么。

here开始,似乎所有线程都应该使用相同的对象来使锁工作。虽然从here开始,但这似乎是应该避免死锁的原因。

请记住,我可能误解了整个锁定问题,因为我只是asked a question关于如何“锁定”变量并得到对我来说似乎< / em>根本没有实现(除了锁定代码)。

3 个答案:

答案 0 :(得分:4)

将锁视为&#34;说话棒&#34;在一些会议中使用的。拿着棍子的人都可以说话。任何想说话的人都必须等到发言者放弃棍子。

当一段代码获取对象的锁定时,在同一对象上请求锁定的任何其他代码必须等到原始代码释放锁定。

那你应该锁定哪个对象?这在很大程度上取决于背景。经验法则是您锁定一个对象,其他可能影响代码块的人也可以锁定。如果您要更新集合,则可以ICollection.SyncRoot为例。

OP编辑(希望更正) &#34;任何想说话的人&#34; - 作为该棒的发言者&#34;。 (任何人都可以说话。) 至于问题中的第二个链接 - 它指的是一个锁等待一秒的问题,而第二个链是等待第一个。

答案 1 :(得分:3)

应该在任何共享资源周围使用

lock。通过&#34;共享资源&#34;我指的是由多个线程访问的任何内容。

所有锁定都是:

  1. 传入的线程想要访问一段代码,遇到锁定
  2. 锁定为空,允许线程
  3. 线程被切换
  4. 另一个线程想要访问相同的代码(或锁定在同一个变量上的代码),遇到锁定
  5. 变量已被锁定,线程必须等待
  6. 原始线程重新开启,退出锁定代码
  7. 重新打开第二个线程,执行锁定的代码
  8. 如果可以将线程置于锁中并同时等待另一个锁定,然后等待第一个锁定,则会出现网格锁定情况。通常情况下,你没有“窝”#34;你的锁以避免这个问题。此外,对于性能,如果没有别的,你很少锁定相同的变量,除非你实际上有两个部分依赖于不同时执行的代码(如果它是这样可能是一个糟糕的设计:))

答案 2 :(得分:0)

锁定某些内容旨在保护共享内存。因此,您必须对要保护的特定元素使用相同的SyncRoot ...但是,假设您有3个需要保护的对象,并且它们没有任何关联:

A a = new A();
B b = new B();
C c = new C();

然后没有理由对所有3个使用相同的SyncRoot。事实上,如果它们真的是分开的,那就没有效率了。