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