Как работает SyncLock в .Net - PullRequest
       35

Как работает SyncLock в .Net

0 голосов
/ 22 апреля 2011

У меня есть список объектов, совместно используемых несколькими потоками, он иногда генерирует IndexOutOfRangeException при попытке Clear. При поиске решения я обнаружил, что должен использовать SyncLock при доступе к списку.

Но мой вопрос, каково значение lockObject в SyncLock блоке например при очистке myList могу ли я использовать

Synclock myList
    myList.Clear
End SyncLock

или lockObject должен отличаться от myList?

Изменить:

Что я думаю о sysnclock, так это о том, что «блокировка получена для объекта, указанного как lockObject». Что если я укажу список для очистки как lockObject, не должен ли компилятор получить эксклюзивный доступ к списку перед его очисткой?

1 Ответ

4 голосов
/ 22 апреля 2011

Выбор произвольный - ссылка может быть полностью независимой от данных, к которым вы обращаетесь в блоке, или вы можете использовать что-то вроде ссылки на список.

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

Обратите внимание, что вы не должны просто использовать блокировку для очистки - вам нужно будет использовать ее везде для доступа к списку.

...