<< ПредыдущаяОглавлениеСледующая >>


10.5. Синхронизация

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

В Java имеется элегантный механизм общения между подпроцессами, основанный на методах wait, notify и notifyAll. Эти методы реализованы как final- методы класса Object, так что они имеются в любом Java-Knacce. Все эти методы должны вызываться только из синхронизованных методов. Правила использования этих методов очень просты:

1. wait — приводит к тому, что текущий подпроцесс отдает управление и переходит в режим ожидания до тех пор пока другой подпроцесс не вызовет метод notify с тем же объектом;

2. notify — выводит из состояния ожидания первый из подпроцессов, вызвавших wait с данным объектом;

3. notifyAll — выводит из состояния ожидания все подпроцессы, вызвавшие wait с данным объектом.

 



<< ПредыдущаяОглавлениеСледующая >>