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