gpt4 book ai didi

c# - 是锁定实例还是基于成员

转载 作者:太空狗 更新时间:2023-10-30 00:10:19 27 4
gpt4 key购买 nike

我有一个关于在 C# 中锁定的问题。 c# 是否锁定对象或成员的实例。

如果我有以下代码:

lock(testVar)
{
testVar = testVar.Where(Item => Item.Value == 1).ToList();
//... do some more stuff
}

即使我将 testVar 设置为新值,c# 是否保持锁定?

最佳答案

所有 C# 对象都继承自 System.Object , 它本身总是包含 4 个字节,专用于 lock 的语法糖.这称为 SyncBlock 对象

当您使用 new 创建新对象时,在你的情况下,ToList它生成了对 List<T> 的新引用,您实际上是在覆盖旧引用,这会使您的 lock 无效.这意味着现在多个线程可能可能在你的lock中。 .编译器会将您的代码转换为 try-finally用一个额外的局部变量来阻止,以避免你开枪。

这就是为什么最好的做法是定义一个专用私有(private)只读变量,它将充当同步根对象,而不是使用类成员。这样,阅读您代码的任何人都清楚您的意图。

编辑:

有一个nice article on MSDN它描述了内存中的对象结构:

SyncTableEntry also stores a pointer to SyncBlock that contains useful information, but is rarely needed by all instances of an object. This information includes the object's lock, its hash code, any thunking data, and its AppDomain index. For most object instances, there will be no storage allocated for the actual SyncBlock and the syncblk number will be zero. This will change when the execution thread hits statements like lock(obj) or obj.GetHashCode.

Object in memory representation

关于c# - 是锁定实例还是基于成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27900571/

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