Задание включает в себя следующие исходные файлы:
src/Bank.kt
содержит интерфейс для гипотетического банка.src/BankImpl.kt
содержит реализацию операций банка для однопоточного случая. Данная реализация небезопасна для использования из нескольких потоков одновременно.- Альтернативная реализация на Java дана в
java/BankImpl.java
.
- Альтернативная реализация на Java дана в
Необходимо доработать реализую BackImpl
так, чтобы она стала безопасной для использования из множества потоков одновременно.
- Для реализации необходимо использовать тонкую блокировку.
- Синхронизация должна осуществляться для каждого счета по отдельности.
- Добавьте поле
lock
типаjava.util.concurrent.locks.ReentrantLock
(класс для примитива блокировки) в классBankImpl.Account
и используйте его для блокировки операций над соответствующим счетом. - В Kotlin можно использовать
lock.withLock { ... }
для работы с одним или двумя счетами, но для блокировки всех счетов потребуется напрямую использовать методыlock()
иunlock()
.
- Для обеспечения линеаризуемости операций должна использоваться двухфазная блокировка для всех операций.
- Для избегания ситуации взаимной блокировки (deadlock) необходимо использовать иерархическую блокировку.
- Весь код должен содержаться в файле
src/BankImpl.kt
илиsrc/BankImpl.java
.- В случае использования Java, удалите
src/BankImpl.kt
и скопируйтеjava/BankImpl.java
вsrc/BankImpl.java
в качестве шаблона кода.
- В случае использования Java, удалите
- В заголовке файла, в строке
@author
впишите вашу фамилию и имя.
Проект должен собираться и успешно проходить тестирование с помощью команды ./gradlew test
.
При этом автоматически будут запущены следующие тесты:
FunctionalTest
проверяет базовую корректность работы операций банка.MTStressTest
проверяет основные аспекты корректности работы банка при множестве одновременно работающих потоков исполнения.LinearizabilityTest
проверяет все аспекты корректности работы банка и линеаризуемость операций, сравнивая различные варианты одновременного выполнения операций с различными вариантами их перестановки на модельной однопоточной реализации.CodeTest
делает базовую проверку структуры кода на соответствие заданию.
Исходная реализация проходит только FunctionalTest
, но не проходит многопоточные тесты и тест на
структуру кода (нет поля lock
). Все тесты кроме CodeTest
будут проходить, если у каждого метода класса BankImpl
написать
аннотацию @Synchronized
(ключевое слово synchronized
в Java), тем самым сделав грубую блокировку.
Однако задание требует применение тонкой, а не грубой, блокировки.