Page 248 - 6571
P. 248

Інтерфейс Lock надає розробникам високу ступінь контролю
                  над блокуваннями. Але найчастіше такий контроль є зайвим, і за-
                  звичай  буває  достатньо  механізму  синхронізації,  вбудованого  в

                  мову Java.
                        Процес синхронізації в мові Java є досить простим, оскільки
                  усі об’єкти володіють власними, асоційованими з ними неявними

                  моніторами.  Щоб  увійти  в  монітор  об’єкта,  необхідно  просто
                  викликати           метод,        модифікований              ключовим            словом
                  synchronized.                 Коли        потік        знаходиться           всередині

                  синхронізованого методу, то всі інші потоки, які намагаються йо-
                  го  викликати  з  того  ж  екземпляру  класу  переводяться  в  режим
                  очікування. Щоб вийти з монітора і передати керування об’єктом

                  іншому  заблокованому  потоку,  «власник»  монітора  просто
                  повертає керування із синхронізованого методу.
                        Якщо         метод        оголошений             з     ключовим            словом
                  synchronized, то блокування об’єкта захищає весь метод. От-

                  же,  щоб  викликати  метод  позначений  ключовим  словом
                  synchronized, потік повинен захопити вбудоване блокування

                  об’єкта. Іншими словами, наступний фрагмент коду:
                        public synchronized void transfer() {

                           // критична секція коду
                        }


                  рівнозначний наведеному вище фрагменту коду із застосуванням
                  класу ReentrantLock для блокування одночасного доступу до
                  критичної секції із декількох потоків.

                        Окрім  звичайних  методів,  допускається  оголошувати
                  синхронізованими  також  і  статичні  методи.  Коли  викликається
                  такий  метод,  то  він  захоплює  вбудоване  блокування  об’єкта

                  відповідного  класу.  Тобто,  якщо  в  класі  Bank  є  статичний
                  синхронізований метод, то при його виклику захоплюється бло-
                  кування  об’єкта  типу  Bank.class.  У  результаті  до  такого

                  об’єкта  не  може  отримати  доступ  жодний  інший  потік  та
                  синхронізований статичний метод того ж класу.
                        Проте, існують й інший механізм захоплення блокування, що

                  полягають у входженні в синхронізований блок. Припустимо, що
                  необхідно синхронізувати доступ до об’єктів класів, які не були
                  призначені для багатопотокового доступу. Тобто клас не визначає



                                                             247
   243   244   245   246   247   248   249   250   251   252   253