Page 262 - 6253
P. 262

на  ту  ж  саму  позицію.  Тому,  для  захоплення  блокування  можна  використати

            наступний підхід:

                  public void transfer(Vector<Double> accounts, int from,
                                          int to, int amount) {
                     synchronized (accounts) {

                        accounts.set(from, accounts.get(from) - amount);
                        accounts.set(to, accounts.get(to) + amount);

                     }
                     System.out.println();
                  }

                  Такий підхід цілком працездатний, але він повністю залежить від того факту,

            що вбудоване блокування використовується в класі Vector для всіх його методів. З

            цієї причини, клієнтське блокування є досить ненадійним прийомом, і тому зазвичай

            воно не рекомендується до застосування.


                    10.5.2 Керування міжпотоковими комунікаціями


                  У  попередніх  прикладах  для  блокування  інших  потоків  від  асинхронного

            доступу до методів використовувалися неявні монітори об’єктів. Проте, в мові Java

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

            комунікацій.

                  Як  уже  було  сказано  раніше,  багатопотоковість  замінила  програмування  на

            основі  циклів  подій  за  рахунок  поділу  задач  на  дискретні,  логічно  відокремлені

            одиниці. Проте, це не єдина перевага потоків. Вони також виключають опитування,

            що зазвичай реалізуються у вигляді циклу, який використовується для періодичної

            перевірки деякої умови. Наприклад, розглянемо класичну задачу в якій один потік

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

            перш ніж створити нові дані повинен очікувати, поки споживач не завершить свою

            роботу. У системах  із опитуванням споживач даних  витрачає  цикли процесора на

            очікування  даних  від  постачальника.  Як  тільки  постачальник  завершить  свою

            роботу, він повинен розпочати опитування, очікуючи завершення роботи споживача

            даних, і т.д.

                  З  метою  уникнення  опитувань,  мова  Java  реалізує  елегантний  механізм

            міжпотокових комунікацій з використанням методів wait(), notify() та notifyAll().




                                                              261
   257   258   259   260   261   262   263   264   265   266   267