Вопрос

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

Является ли это правильным использованием свойства SyncRoot?

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top