Когда ты говоришь
lock (obj)
...
.NET использует критическую секцию в obj
для синхронизации следующих операторов.
Как инициализируется этот критический раздел? (например, инициализируется ли он во время строительства или лениво?)
Когда ты говоришь
lock (obj)
...
.NET использует критическую секцию в obj
для синхронизации следующих операторов.
Как инициализируется этот критический раздел? (например, инициализируется ли он во время строительства или лениво?)
Каждый объект получает 4-байтовый «блок» памяти, выделенный ему (syncblk), который является индексом в SyncTableEntry. Когда объект создан, syncblk присваивается 0, что предотвращает любое дополнительное выделение памяти (кроме этого 4-байтового числа). При взятии блокировки этот syncblk устанавливается на соответствующую запись в таблице, что может привести к выделению. По сути, это ленивая инициализация.
Когда вы вызываете lock(object), это эффективно использует Monitor.Enter
для объекта, что, в свою очередь, устанавливает запись соответствующим образом. Подробнее см. в этой статье MSDN о внутреннем устройстве памяти .NET.
Согласно документации Microsoft процесс выделяет память критической секции при объявлении переменной типа CRITICAL_SECTION.