Преимущество использования EnterUpgradeableReadLock
над EnterReadLock
заключается в том, что вы можете точно знать, что условие, которое вы проверяете, чтобы определить, вводить ли блокировку записи или нет, не меняется между проверкой условия и фактическим вводомблокировка записиЭто позволяет избежать дублирования, которое может потребоваться при обычных lock
s:
if (whatever-condition)
{
lock (_lockObject)
{
// the condition may have changed betwen the check and the lock; verify
// that the condition is still valid
if (whatever-condition)
{
// do the stuff
}
}
}
. В то же время он не блокирует вызовы EnterReadLock
, поэтому другие потоки все еще могутполучить доступ на чтение в других частях кода (и эти вызовы, конечно, будут блокировать вызов на EnterWriteLock
до тех пор, пока они не снимают блокировки чтения).