Page 248 - 6571
P. 248
Інтерфейс Lock надає розробникам високу ступінь контролю
над блокуваннями. Але найчастіше такий контроль є зайвим, і за-
звичай буває достатньо механізму синхронізації, вбудованого в
мову Java.
Процес синхронізації в мові Java є досить простим, оскільки
усі об’єкти володіють власними, асоційованими з ними неявними
моніторами. Щоб увійти в монітор об’єкта, необхідно просто
викликати метод, модифікований ключовим словом
synchronized. Коли потік знаходиться всередині
синхронізованого методу, то всі інші потоки, які намагаються йо-
го викликати з того ж екземпляру класу переводяться в режим
очікування. Щоб вийти з монітора і передати керування об’єктом
іншому заблокованому потоку, «власник» монітора просто
повертає керування із синхронізованого методу.
Якщо метод оголошений з ключовим словом
synchronized, то блокування об’єкта захищає весь метод. От-
же, щоб викликати метод позначений ключовим словом
synchronized, потік повинен захопити вбудоване блокування
об’єкта. Іншими словами, наступний фрагмент коду:
public synchronized void transfer() {
// критична секція коду
}
рівнозначний наведеному вище фрагменту коду із застосуванням
класу ReentrantLock для блокування одночасного доступу до
критичної секції із декількох потоків.
Окрім звичайних методів, допускається оголошувати
синхронізованими також і статичні методи. Коли викликається
такий метод, то він захоплює вбудоване блокування об’єкта
відповідного класу. Тобто, якщо в класі Bank є статичний
синхронізований метод, то при його виклику захоплюється бло-
кування об’єкта типу Bank.class. У результаті до такого
об’єкта не може отримати доступ жодний інший потік та
синхронізований статичний метод того ж класу.
Проте, існують й інший механізм захоплення блокування, що
полягають у входженні в синхронізований блок. Припустимо, що
необхідно синхронізувати доступ до об’єктів класів, які не були
призначені для багатопотокового доступу. Тобто клас не визначає
247