Выбор правильного объекта для блокировки в синхронизации потоков? - PullRequest
0 голосов
/ 31 декабря 2010

Обычно примеры кода используют блокировки таким образом:

static readonly object lockForWorkingWithSharedObject = new object();

lock(lockForWorkingWithSharedObject)
{
   // do something with shared object
}

Таким образом, нам нужно много замков в большом классе. Является ли хорошей практикой использование самого общего объекта в качестве объекта синхронизации?

// of course here sharedObject is a reference type
lock(sharedObject)
{
   // do something with sharedObject
}

1 Ответ

1 голос
/ 31 декабря 2010

В Java и .NET смысл блокировки каждого объекта заключается именно в том, что разработчики языка считали, что было бы полезно использовать сам объект в качестве блокировки; следовательно, также ключевое слово synchronized в Java.

Если вам нужна более тонкая детализация блокировки, я бы предположил, что вам лучше разделить состояние вашего объекта на несколько объектов, сгруппированных по семантически связанным элементам, и, следовательно, вероятно, также необходимо защитить от одновременного доступа вместе.

...