c#锁定问题:锁定(此)vs锁定(SyncRoot)

Nes*_*tor 9 c# locking

我有一个类型集合字段的类.

问题:

  1. 如果我lock(this),我是否也有效锁定了收藏?
  2. 什么更有效,做lock(this)或创建一个SyncRoot对象lock(SyncRoot)呢?

jas*_*son 12

不要lockthis.可能是其他人也将该实例用作lock对象的情况.使用专门指定的lock对象.

1)如果我锁定(这个),我是否也有效地锁定了收藏?

没有.

2)什么更有效,做锁(this)或创建一个SyncRoot对象并做锁(SyncRoot)?

高效?专注于语义. lock坚持this是危险的.不要这样做.性能差异(如果有的话)并不重要.

说真的,这类似于询问,什么会让我更快到达目的地,在高速公路上以错误的方式行驶100英里/小时,还是走路?

  • @Nestor:哦不,它绝对不会那样做.基本上,`lock`只是将实例的引用添加到某个集合中(也许它是一个`HashSet <object>`,谁知道,无所谓).当其他人试图在同一个实例上"锁定"时,`lock`机制会检查该引用是否已经在集合中.如果是,它会阻止.如果不是,则将其添加到集合中并获取返回给调用者的`lock`.调用者完成后,将从集合中删除引用.这就对了.它不会使`object`只读或类似的东西. (2认同)

Ray*_*Ray 8

一直用lock(_syncRoot).

_syncRoot私人领域在哪里(只需要成为一个对象).

这在效率方面没有区别,但你最好拥有一个你可以控制的私人领域来锁定.如果你锁定this,另一个对象也可能锁定它.

看看为什么锁(这个){...}不好?为了更好的解释.另外看一下关于lock 的msdn文章.

通过锁定集合,您无法阻止其被更改.你可能有一个误解,就是锁没有做任何特别的事情来阻止那个对象被改变,它只有在每个关键代码都调用锁时才有效.