Пока вы не ожидаете несколько объектов блокировки, это должно быть хорошо. Тупик возникает, когда у вас такая ситуация:
Тема A:
lock (lockObject1)
{
// Do some stuff
lock (lockObject2)
{
// Do some stuff
}
}
Резьба B:
lock (lockObject2)
{
// Do some stuff
lock (lockObject1)
{
// Do some stuff
}
}
Если вам случится заблокировать lockObject1 в потоке A, а поток B заблокирует lockObject2 до того, как поток A заблокирует его, тогда оба потока будут ожидать объект, заблокированный в другом потоке, и ни один из них не будет разблокирован, поскольку каждый ожидает, пока объект заблокирован. Это упрощенный пример - есть много способов, которыми можно оказаться в этой ситуации.
Чтобы избежать тупика, не ждите второго объекта, пока у вас заблокирован первый объект. Если вы блокируете один объект за один раз, как это, вы не можете получить взаимоблокировку, потому что в конечном итоге поток блокировки освободит объект, который нужен ожидающему потоку. Так, например, вышеприведенное должно быть развернуто:
Тема A:
lock (lockObject1)
{
// Do some stuff
}
lock (lockObject2)
{
// Do some stuff
}
Резьба B:
lock (lockObject2)
{
// Do some stuff
}
lock (lockObject1)
{
// Do some stuff
}
В этом случае каждая операция блокировки будет завершена без попытки получения других ресурсов, и поэтому исключается взаимоблокировка.