SyncLock на SyncRoot - PullRequest
       16

SyncLock на SyncRoot

3 голосов
/ 13 июля 2009

Я создал синхронизированную очередь и использую SyncLock для свойства SyncRoot этой очереди, когда я вызываю методы Enqueue / Dequeue. Методы вызываются из экземпляров стандартных классов производитель / потребитель.

Это правильное использование свойства SyncRoot?

Будет ли лучше создать закрытый общий объект в каждом классе и вместо этого заблокировать его?

Пожалуйста, объясните ваши рассуждения.

1 Ответ

6 голосов
/ 13 июля 2009

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

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

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

...