Цель задания
Научиться работать с syncronyzed
блоками и избегать ситуации deadlock.
Условие задания
Проект Transactions. В банке (класс bank.Bank
) есть счета (класс bank.Account
) с двумя полями — money
и accNumber
.
Все счета хранятся внутри банка. Множество клиентов банка могут одновременно переводить деньги между счетами и запрашивать баланс по своему счёту. Всё происходит в highly concurrent (многопоточной) среде.
При этом транзакции на суммы > 50000 отправляются на проверку в службу безопасности. Можно считать, что таких транзакций не более 5% от всех. За проверку отвечает отдельный и уже реализованный метод bank.Bank.isFraud()
.
Служба безопасности не может обрабатывать более одной транзакции одновременно. Проверка занимает 1000 мс.
Если служба безопасности обнаружила мошенничество, необходимо заблокировать оба счёта, то есть запретить любые изменения остатков в дальнейшем.
Что нужно сделать
- Создайте метод
transfer()
классаbank.Bank
, который переводит деньги с одного счёта на другой. Если сумма транзакции > 50000 — транзакция отправляется на проверку службе безопасности: вызывается методisFraud()
. Если возвращаетсяtrue
, то счета блокируются (как – на ваше усмотрение). - Создайте метод
getBalance()
классаbank.Bank
, который возвращает остаток на счёте по переданной строке номера аккаунта.
Рекомендации
- Для решения задачи вы можете дорабатывать классы
bank.Account
иbank.Bank
как угодно. - Дополнительно создайте тест (или набор тестов) для эмуляции реальной работы этих двух классов и проверки системы.
- Проверяйте сумму на банковских счетах до запуска транзакций и после завершения — сумма в банке не должна измениться.
- Удостоверьтесь, что ваша программа работает в многопоточном режиме. Для этого можете использовать утилиту visualVM.
Критерии оценки
«Зачёт» — программа позволяет в многопоточной среде работать банковским транзакциям без «потери» денег в банке и ситуаций deadlock.
«Незачёт» — задание не выполнено.