Page 188 - 6571
P. 188

використати.  У  даному  випадку  доведеться  написати  набагато
                  менше коду, а отже, допустити менше помилок.
                        3.       Об’єкти           типу        Lock / Condition                необхідно
                  використовувати  тільки  у  тому  випадку,  якщо  дійсно  потрібні

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

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

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

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

                  полягає  у  виклику  методів  такого  класу  в  блоці  позначеного
                  ключовим словом synchronized.
                        Коли       потік       входить        у     блок       позначений          словом

                  synchronized, то він захоплює блокування об’єкта obj.

                        synchronized (obj) { // синтаксис синхронізованого блоку
                          критична секція коду;
                        }

                        Іноді  в  коді  зустрічаються  спеціальні  блокування  схожі  до
                  наступного:

                        public class Bank {
                          private double[] accounts;
                          private Object lock = new Object();
                          ...
                          public void transfer(int from, int to, int amount) {
                            synchronized (lock) { // спеціальне блокування
                              accounts[from] = accounts[from] - amount;
                              accounts[to] = accounts[to] + amount;
                            }
                            System.out.println();
                          }
                        }




                                                             187
   183   184   185   186   187   188   189   190   191   192   193