Page 177 - 6571
P. 177
У випадку, коли два або більше потоків мають доступ до
спільно ресурсу, необхідна гарантія того, що доступ до ресурсу в
конкретний момент часу буде мати тільки один потік. Процес
виконання даної умови називається синхронізацією.
У мові Java ключем до синхронізації виступає концепція
монітора. Монітор у мові Java – це об’єкт, який
використовується, як взаємовиключне блокування (mutually
exclusive lock), або м’ютекс. Тільки один потік може в один і той
же самий час володіти монітором. Коли потік робить запит на
блокування, то кажуть, що він входить в монітор. Всі інші
потоки, які намагаються увійти в заблокований монітор, будуть
призупинені до того часу, поки потік, що отримав блокування не
покине з монітор. Про всі інші потоки говорять, що вони
очікують монітора. Потік, який володіє монітором, за
необхідності може повторно в нього увійти.
У термінології мови Java монітор володіє наступними
властивостями:
1. Монітор – це клас, що має тільки закриті поля.
2. У кожного об’єкта такого класу є зв’язане з ним блокування.
3. Всі методи блокуються даним блокуванням. Тобто, якщо
клієнт викликає метод obj.method(), блокування об’єкта obj
автоматично захоплюється під час виклику цього методу і
знімається під час його завершення. А оскільки всі поля класу
монітора закриті, то такий підхід гарантує, що до них не можна
буде звернутися із жодного потоку доти, поки ними маніпулює
будь-який інший потік.
4. Блокування може мати будь-яку кількість пов’язаних з ним
умов.
Розробники мови Java вільно адаптували принцип монітора.
Кожен об’єкт в Java володіє вбудованим блокуванням і
вбудованою умовою. Якщо метод оголошений із ключовим
словом synchronized, то він діє як метод монітора. Умовна
змінна доступна через виклики методів wait(), notifyAll() та
notify(). Проте, об’єкти в мові Java відрізняються від класичної
реалізації монітора наступними трьома важливими пунктами, що
потенційно можуть впливати на безпеку потоків:
1. Поля не обов’язково повинні бути закритими (private).
176