gpt4 book ai didi

c# - 锁定对象究竟意味着什么?

转载 作者:太空狗 更新时间:2023-10-29 20:53:42 26 4
gpt4 key购买 nike

虽然我在我的应用程序中使用了锁,但我不明白锁定特定引用类型的具体作用是什么。我以为它只是停止线程,直到 {} 的内容完成。但我读过,锁定(这个)是不好的,如果它是公开的 - 为什么?文章对此进行了解释,但我不明白,因为我不知道对象本身被锁定时发生了什么。例如,如果我使用 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/

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