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