Задание включает в себя следующие исходные файлы:
Bank.java
содержит интерфейс для гипотетического банка.BankImpl.java
содержит реализацию операций банка для однопоточного случая. Данная реализация небезопасна для использования из нескольких потоков одновременно.
Необходимо доработать реализую BackImpl
так, чтобы она стала безопасной для использования из множества потоков одновременно. Переписывать реализацию на Kotlin нельзя.
- Для реализации необходимо использовать тонкую блокировку. Синхронизация должна осуществляться для каждого счета по отдельности. Добавьте поле
lock
типаjava.util.concurrent.locks.Lock
(интерфейс для примитива блокировки) в классBankImpl.Account
и используйте классjava.util.concurrent.locks.ReentrantLock
в качестве стандартной реализации. - Для обеспечения линеаризуемости операций должна использоваться двухфазная блокировка для всех операций.
- Для избегания ситуации взаимной блокировки (deadlock) необходимо использовать иерархическую блокировку.
- Весь код должен содержаться в файле
BankImpl.java
, изменять другие файлы запрещается.
Проект должен собираться и успешно проходить тестирование с помощью команды mvn test
. При этом автоматически будут запущены следующие тесты:
FunctionalTest.java
проверяет базовую корректность работы операций банка.MTStressTest.java
проверяет основные аспекты корректности работы банка при множестве одновременно работающих потоков исполнения.LinearizabilityTest.java
проверяет все аспекты корректности работы банка и линеаризуемость операций, сравнивая различные варианты одновременного выполнения операций с различными вариантами их перестановки на модельной однопоточной реализации.
Обратите внимание, что исходная реализация проходит только FunctionalTest
, но не проходит многопоточные тесты. При этом, прохождения тестов недостаточно для зачета за это задание. Тесты будут проходить, если у каждого метода класса BankImpl
написать ключевое слово synchronized
(проверьте!). Но такая реализации, несмотря на прохождение тестов, не удовлетворяет заданию, которое требует применение тонкой, а не грубой, блокировки.