Учитывая следующий класс:Необходим несколько объектов блокировки?
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
не связаны в любом случае. Единственными операциями, связанными с блокировками, являются операции, указанные в комментариях выше.
Это называется замок Расщепление и является хорошим способом уменьшить конкуренцию, если два объекта и методы независимый. – assylias
Его следует называть здравым смыслом, делать это наоборот - очень плохая практика. – Dariusz
Одна вещь, которую вы можете захотеть, это использовать [ReaderWriterLock] (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx). Если вы только читаете из списка, он позволяет использовать несколько потоков сразу («Список» имеет потокобезопасные чтения), как только вам нужно написать, что вы обновляете блокировку, и только один поток может писать, и все читатели блокируются, после этого несколько считывателей могут начать снова. –