Необходимо несколько объектов блокировки?

Учитывая следующий класс:

class x
{
    Object lockOne = new Object();
    Object lockTwo = new Object();

    List<Something> listOne = new List<Something>();
    List<Something> listTwo = new List<Something>();

    void MethodOne()
    {
        lock(lockOne)
        {
            // some operation on listOne
        }
    }

    void MethodTwo()
    {
        lock(lockTwo)
        {
            // some operation on listTwo
        }
    }
}

Правильно ли использовать два объекта блокировки, предполагая, что MethodOne() и MethodTwo() можно вызывать из разных потоков одновременно, отмечая, что listOne и listTwo не связаны друг с другом. Единственными операциями, связанными с блокировками, являются те, которые указаны в комментариях выше.

Ответ 1

Да, это правильно. Он избегает ненужного блокирования одного списка только потому, что работает над другим списком.

Ответ 2

Здесь нет необходимости в отдельных объектах блокировки. Следующий код будет работать так же хорошо, с меньшим количеством кода, меньшими накладными расходами и меньшим шансом ошибочно использовать неправильный замок:

class x
{
    List<Something> listOne = new List<Something>();
    List<Something> listTwo = new List<Something>();

    void MethodOne()
    {
        lock (listOne)
        {
            // some operation on listOne
        }
    }

    void MethodTwo()
    {
        lock (listTwo)
        {
            // some operation on listTwo
        }
    }
}