Data la seguente classe:Sono necessari più oggetti di blocco?
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
}
}
}
È corretto utilizzare due oggetti bloccaggio assumendo che MethodOne()
e MethodTwo()
può essere chiamato da diversi thread contemporaneamente rilevando che listOne
e listTwo
non sono correlati in alcun modo. Le uniche operazioni coinvolte nei blocchi sono quelle specificate nei commenti sopra.
Si chiama splitting blocco ed è un buon modo per ridurre la contesa se i due oggetti e metodi sono indipendente. – assylias
Dovrebbe essere definito di buon senso, farlo in senso contrario è una pessima pratica. – Dariusz
Una delle cose che potresti voler vedere è usare un [ReaderWriterLock] (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx). Se stai leggendo solo dall'elenco, consente a più thread di usarlo contemporaneamente ('List' ha letture thread-safe), una volta che hai bisogno di scrivere, aggiorna il lock e quindi solo un thread può scrivere e tutti i lettori sono bloccati, in seguito i lettori multipli possono ricominciare. –