Вложенные блокировки будут работать - однако одна из опасностей заключается в том, что нужно всегда блокировать объекты в одном и том же порядке, иначе можно вызвать тупик.
РЕДАКТИРОВАТЬ: ответить на второй вопроспри попытке принудительно установить правильный порядок блокировок:
Возможное решение, позволяющее избежать этого, может заключаться в том, чтобы заключить блокировку в общий метод блокировки, например:
public void LockAndDoWork(Action action)
{
lock(lockObject1)
{
lock(lockObject2)
{
action();
}
}
}
.это:
Thread1: LockAndDoWork(() => {do some work....});
Thread2: LockAndDoWork(() => {do some other work...});
Это может помочь избежать этой потенциальной проблемы - это особенно полезно, если можно ограничить видимость для этих объектов из клиентского кода