Ответ 1
Да, это правильно. Он избегает ненужного блокирования одного списка только потому, что работает над другим списком.
Учитывая следующий класс:
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
не связаны друг с другом. Единственными операциями, связанными с блокировками, являются те, которые указаны в комментариях выше.
Да, это правильно. Он избегает ненужного блокирования одного списка только потому, что работает над другим списком.
Здесь нет необходимости в отдельных объектах блокировки. Следующий код будет работать так же хорошо, с меньшим количеством кода, меньшими накладными расходами и меньшим шансом ошибочно использовать неправильный замок:
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
}
}
}