c# - 与每个对象关联的临界区是如何初始化的?

标签 c# .net synchronization critical-section

当你说

lock (obj)
    ...

.NET 使用 obj 中的关键部分来同步以下语句。

这个临界区是如何初始化的? (例如,它是在构造时初始化还是延迟初始化?)

最佳答案

每个对象都有一个分配给它的 4 字节内存“ block ”(syncblk),它是 SyncTableEntry 的索引。创建对象时,syncblk 被分配为 0,这可以防止任何额外的内存分配(除了这个 4 字节数)。获取锁时,此 syncblk 将设置为表中的适当条目,然后可能会导致分配。实际上,这是一个惰性初始化。

当您调用 lock(object) 时,实际上是在对象上使用 Monitor.Enter,这反过来会适本地设置条目。有关详细信息,请参阅此 MSDN article on .NET Memory Internals .

关于c# - 与每个对象关联的临界区是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609117/

相关文章:

c# - 没有 Getter/Setter 的反射?

c# - 在 CurrentItemChanged 上将文本框的内容设置为大写

java stacktrace 显示一个阻塞的线程,但没有关于阻塞它的信息

linux - Linux 中内核空间和用户空间之间的原子行为?

c# - 系统.Runtime.Remoting.RemotingException : Requested Service not found

java - java中如何启动ThreadGroup?

c# - EPPlus 改变单元格的边框颜色

C# - 如何使用制表符正确缩进字符串数据?

c# - Windows Phone 8.1 商店应用程序 - 商店链接

c# - 如何通过 ASP.NET 路由来路由图像?