Каждый раз, когда вы используете блокирующий примитив, такой как lock
или Monitor.Enter
, в платформе .NET, структура блока синхронизации инициализируется для экземпляра объекта, который нужно заблокировать. Как указано в определении, эти блоки могут содержать больше информации, такой как хэш-код объекта и информация о взаимодействии COM.
Поскольку эти блоки ограничены в том, что может быть сохранено, одновременный доступ к блокам вызывает конфликт, что, в свою очередь, приводит к тому, что содержимое заголовка объекта становится индексом в таблице общесистемных блоков синхронизации, управляемых CLR. CLR может перерабатывать эти блоки синхронизации как и когда они нужны объекту.
Блокировка объекта всегда вызывает вращение ЦП перед ожиданием объекта ядра системы. Всякий раз, когда выделенное вращение ЦП не удовлетворяет разрешению монитору захватить блокировку критической секции, будет создан дескриптор события автоматического сброса системы, и ссылка на него будет помещена в соответствующий блок синхронизации. Другие потоки, ожидающие этого дескриптора события, будут затем блокировать дескриптор события, пока поток-владелец не вызовет освобождение дескриптора события.
Следовательно, если этот счетчик постоянно увеличивается, это признак того, что слишком много потоков находится в состоянии конкуренции за блокировку одного или нескольких объектов, и эти блокировки могут никогда не освободиться.