Page 254 - 6571
P. 254

account = account + amount;
                              Thread.sleep(2000);
                           } else {
                              account = account - amount;

                              Thread.sleep(2000);
                           }
                           System.out.println("Total  balance:  "  +  account  +
                  "\t");
                        }

                        Логічна змінна action визначає операцію, що проводиться
                  із банківським рахунком. Якщо її значення рівне true, то вважа-

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

                  вах. Рішення даної проблеми може полягати в очікуванні до того
                  часу, поки рахунок не буде поповнено під час виконання іншого
                  потоку. Проте, у представленому прикладі потік володіє монопо-

                  льним доступом до об’єкта bank, тому жоден інший потік не в
                  змозі  виконати  поповнення  рахунку.  Тому  єдиним  правильним
                  рішенням є використання умовної змінної.
                        У  мові  Java  з  будь-яким  об’єктом  блокування  може  бути

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

                  ion  які  створюються  за  допомогою  фабричного  методу  new-
                  Condition().  Кожному  умовному  об’єкту  можна  присвоїти
                  ім’я, що буде асоціюватися з умовою, яку він представляє.

                        public class Bank {
                           private Lock bankLock = new ReentrantLock();
                           private Condition sufficientFunds;

                           public Bank(int acc1, int acc2) {

                              // ініціалізація полів класу
                              sufficientFunds = bankLock.newCondition();
                           }
                        }

                        Фабричний  метод  newCondition()  повертає  умовний
                  об’єкт, пов’язаний з відповідним блокуванням. Якщо під час ви-


                                                             253
   249   250   251   252   253   254   255   256   257   258   259