Читайте также:
|
|
Как и lock, мониторы не допускают одновременное выполнение несколькими потоками одних и тех же блоков кода. Метод Enter позволяет только одному методу переходить к последующим операторам, все прочие методы заблокированы, пока выполняемый метод не вызовет Exit. Это аналогично использованию ключевого слова lock. Ключевое слово lock реализовано с классом Monitor.
Рекомендуется использовать ключевое слово lock, а не класс Monitor, поскольку lock компактнее и потому что lock обеспечивает высвобождение монитора, даже если защищенный код создал исключение. Для этого применяется ключевое слово finally, которые выполняет свой блок кода вне зависимости от наличия исключений.
Класс Monitor контролирует доступ к объектам, предоставляя блокировку объекта одному потоку. Блокировки объектов предоставляют возможность ограничения доступа к части кода, обычно называемой критической секцией. Пока поток владеет блокировкой для объекта, никакой другой поток не может ею завладеть. Можно также использовать Monitor для того, чтобы убедиться, что ни один поток не имеет доступа к секции кода приложения, выполняющейся владельцем блокировки, пока другой поток не будет выполнять код, используя другой объект с блокировкой.
Monitor имеет следующие свойства:
Связывается с объектом по требованию.
Он несвязан, что означает, что он может быть вызван непосредственно из любого контекста.
Невозможно создать экземпляр класса Monitor.
Следующая информация хранится для каждого синхронизированного объекта:
Ссылка на поток, который в данный момент владеет блокировкой.
Ссылка на очередь готовности, которая содержит потоки, готовые получить блокировку.
Ссылка на очередь ожидания, содержащую потоки, ожидающие уведомления об изменении состояния объекта с блокировкой.
Wait
Освобождает блокировку объекта для того, чтобы разрешить другим потокам осуществлять блокировку и получить доступ к объекту. Вызывающий поток ожидает, пока другой поток не произведет доступ к объекту. Для уведомления ожидающих потоков об изменении состояния объекта используются импульсные сигналы.
Pulse(сигнал),PulseAll
Посылает сигнал одному или более ожидающим потокам. Сигнал уведомляет ожидающий поток о том, что состояние объекта с блокировкой изменилось и владелец блокировки готов освободить ее. Ожидающий поток помещен в очередь готовности объекта, так что в конечном итоге он может получить блокировку для объекта. Когда поток получает блокировку, он может проверить новое состояние объекта для того, чтобы увидеть, было ли достигнуто требуемое состояние.
Дата добавления: 2015-01-30; просмотров: 71 | Поможем написать вашу работу | Нарушение авторских прав |