当你说
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/