Biorąc pod uwagę następujące klasy:Niezbędne obiekty wielokrotnej blokady?
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
}
}
}
Czy to prawidłowe użycie dwóch obiektów blokujące Zakładając, że MethodOne()
i MethodTwo()
mogą być wywoływane z różnych wątków jednocześnie zauważając, że listOne
i listTwo
nie są związane w żaden sposób. Jedyne operacje związane z zamkami są określone w komentarzach powyżej.
nazywany jest blokada łupania i jest dobrym sposobem na zmniejszenie rywalizacji, jeśli dwa obiekty i metody są niezależny. – assylias
To powinno być nazywane zdrowym rozsądkiem, robienie tego na odwrót jest bardzo złą praktyką. – Dariusz
Jedną z rzeczy, na które warto zwrócić uwagę, jest użycie [ReaderWriterLock] (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx). Jeśli czytasz tylko z listy, to pozwala na użycie wielu wątków jednocześnie ("Lista" ma odczyty bezpiecznych wątków), gdy musisz napisać, zaktualizuj blokadę i wtedy tylko jeden wątek może pisać, a wszyscy czytelnicy są zablokowani, później wielu czytelników może zacząć od nowa. –