Page 259 - 6253
P. 259
10.5 Вбудовані методи синхронізації потоків
10.5.1 Використання ключового слова synchronized
Інтерфейси Lock та Condition надають розробникам високу ступінь контролю
над блокуваннями. Але найчастіше такий контроль є зайвим, і зазвичай буває
достатньо механізму синхронізації, вбудованого в мову Java.
Процес синхронізації в мові Java є досить простим, оскільки усі об’єкти
володіють власними, асоційованими з ними неявними моніторами. Щоб увійти в
монітор об’єкта, необхідно просто викликати метод, модифікований ключовим
словом synchronized. Коли потік знаходиться всередині синхронізованого методу, то
всі інші потоки, які намагаються його викликати з того ж екземпляру класу
переводяться в режим очікування. Щоб вийти з монітора і передати керування
об’єктом іншому заблокованому потоку, «власник» монітора просто повертає
керування із синхронізованого методу.
Якщо метод оголошений з ключовим словом synchronized, то блокування
об’єкта захищає весь метод. Отже, щоб викликати метод позначений ключовим
словом synchronized, потік повинен захопити вбудоване блокування об’єкта. Іншими
словами, наступний фрагмент коду:
public synchronized void method() {
тіло методу;
}
рівнозначний наведеному нижче фрагменту коду.
public void method() {
this.intrinsicLock.lock();
try {
тіло методу;
} finally {
this.intrinsicLock.unlock();
}
}
Наприклад, замість явного блокування можна просто оголосити метод transfer()
визначений в класі Bank із ключовим словом synchronized. При цьому, вбудоване
блокування має єдину пов’язану з нею умову.
Окрім звичайних методів, допускається оголошувати синхронізованими також і
258