- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
虽然我在我的应用程序中使用了锁,但我不明白锁定特定引用类型的具体作用是什么。我以为它只是停止线程,直到 {} 的内容完成。但我读过,锁定(这个)是不好的,如果它是公开的 - 为什么?文章对此进行了解释,但我不明白,因为我不知道对象本身被锁定时发生了什么。例如,如果我使用 lock(this) 并从另一个线程调用它的方法怎么办?我以为只有锁下的代码被保护了,不然我就根本无法访问被锁住的对象了?谢谢
最佳答案
托管堆上的每个对象都可以用作锁对象,这是一种同步线程间访问的方法。
I thought it just stops the thread until the content of {} is finished.
好吧,一个锁
会阻止其他线程获取锁,直到锁被释放,这最常见于锁
的末尾code> 语句(但也可以是 Monitor.Wait
)。
lock(this)
的使用是危险的,因为锁定很复杂,准确了解哪些线程在何时锁定哪些对象对于避免死锁非常重要;但是,如果您lock(this)
,您将无法控制其他线程 - 这可能也(意外地)锁定同一个对象。使用 private
字段进行锁定要安全得多。
例如,如果您有(在同步列表中):
private IList<T> innerList = ...
public int Count { get { lock(this) { return innerList.Count; } } }
那么不难想象另一段代码也引用了这个同步列表,并锁定了它,例如:
SyncList<T> list = ...
lock(list) { // lock for atomicity
if(!list.Contains(value)) list.Add(value);
}
这是一个潜在的死锁;如果 Count
没有 lock(this)
,但锁定了一个私有(private)对象,那就更好了,即
private readonly object syncLock = new object();
public int Count { get { lock(syncLock) { return innerList.Count; } } }
现在没有这个问题的风险。这里的另一个问题是,类字段事件和 [MethodImpl]
都会导致 lock(this)
。出于完全相同的原因,锁定 Type
(对于静态方法)同样危险。
关于c# - 锁定对象究竟意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988216/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!