gpt4 book ai didi

c# - lock(this) 和静态对象上的锁之间的区别

转载 作者:可可西里 更新时间:2023-11-01 08:33:41 26 4
gpt4 key购买 nike

以下两个代码片段中哪个更好用?

static readonly object _locker = new object();
lock (_locker)

lock (this)

this 是当前实例的一个对象。那么,为什么lock (_locker) 总是在书中?

Related:
What is the difference between lock(this) and lock(thisLock)?
Why is lock(this) {…} bad?

最佳答案

可能会有很大的不同。两者之间最大的区别在于第一个示例使用单个对象锁定(因此使用 static 关键字),而第二个示例中的 this 关键字意味着锁定一个对象实例。因此,从性能角度甚至从正确性角度来看,可能会有很大差异,但这取决于锁内的代码。

当您只需要同步对实例级字段的访问时,您不应该使用 static 关键字,因为这将同步代码本身,而不是数据(这可能会导致不必要的性能打)。当然,如果数据本身是静态的(类级数据而不是实例级数据),则需要使用static关键字。另一方面,当您使用 this 关键字进行锁定时,在访问共享/静态资源时,您(当然)会遇到正确性问题,因为同步是基于实例的,并且多个实例仍将能够同时访问共享数据。

还有另一个问题,但差异比前面提到的差异小得多。第一个示例使用私有(private)声明的对象来锁定,而另一个使用 this 指针,它是对该实例方法本身的对象的引用。由于此引用可供其他对象公开访问,因此它们可能会锁定它,这在极少数情况下可能会导致死锁。如果您是应用程序开发人员,我不会为此担心太多(只要您不锁定 System.StringSystem.Type 之类的东西) ),但如果您是框架开发人员,您当然不应该使用 lock(this),因为没有办法告诉应用程序开发人员将以何种方式(ab)使用您的代码。

关于c# - lock(this) 和静态对象上的锁之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891711/

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