Как объяснено здесь , ключевое слово lock
в C # основано на Monitor
объекте, эксклюзивном механизме синхронизации.«Исключительно» означает, что, когда первый поток входит в критическую секцию, все последующие потоки блокируются .
ReaderWriterLockSlim
, с другой стороны, различает блокировки считывателя и блокиратор записи. Они предназначены для использования (и обеспечивают улучшенный параллелизм) в сценариях, где много читателей, но только случайные обновления записи.Блокировки Reader / Writer неисключительны.
A lock
знает, на каком потоке он был заблокирован, поэтому, если этот поток повторно входит в критическую секцию, он просто увеличивает счетчик ипродолжается.
A ReaderWriterLockSlim
находится в более сложном положении.Поскольку он различает блокировки чтения и блокировки записи, а также потому, что иногда желательно блокировать запись без создания условия гонки, ReaderWriterLockSlim предлагает UpgradableLock
, что позволяет временно улучшить блокировку для возможностей записи, не беспокоясь о гонке.состояние, вызванное мошеннической записью из другого потока, возникающего при переходе в режим записи.
Как видите, ReaderWriterLockSlim
предлагает более многофункциональную, но и более сложную модель для синхронизации, чем lock
делает.Требование заявить о вашем намерении использовать рекурсию - допуск этой дополнительной сложности.
Дальнейшее чтение
Основы синхронизации: Блокировка
Продвинутые потоки: блокировки чтения / записи
Почему рекурсия блокировки вообще плохая идея в любом случае