Безопасно ли использовать существующий объект вместо создания определенного объекта блокировки? - PullRequest
3 голосов
/ 21 ноября 2011

РЕДАКТИРОВАТЬ: Как выясняется, когда я просматривал, я нашел вопрос, кажется, тот же, что и мой, который я не нашел ранее: Разница между блокировкой (locker) и блокировкой (variable_which_I_am_using)

Я смотрю какой-то код и пытаюсь обойти блокирующую штуку, и я думаю, что получаю.

Теперь я заметил, что в некотором коде, который я проверяю, объект создается так:

private HashSet<Graphic> clustersInUse = new HashSet<Graphic>();

Тогда далее в коде используется так:

lock (clustersInUse)
{
   // Do something with the Hashset
}

Теперь, есть проблема с этим, а не с созданием конкретного объекта для блокировки. Как это:

private object clusterLocker = new object();

Что произойдет, если clustersInUse, описанный выше, каким-то образом станет публичной собственностью, что произойдет?

Кроме того, если что-то попытается получить доступ к clustersInUse, не блокируя его, пока оно заблокировано в другом потоке, что произойдет тогда?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Общее правило заключается в том, что вы хотите контролировать область объекта, на который вы блокируете, чтобы предотвратить появление неизвестного кода непредвиденным поведением.В этом случае вы используете закрытую переменную экземпляра, поэтому вы, вероятно, в порядке, если вы не раздаете ссылки на нее.

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

Блокировка объекта не повлияет на использование объекта для каких-либо целей, кроме синхронизации.

2 голосов
/ 21 ноября 2011

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

...