Skip to content

Latest commit

 

History

History

fine-grained-bank

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Синхронизация с помощью тонкой блокировки

Задание включает в себя следующие исходные файлы:

  • src/Bank.kt содержит интерфейс для гипотетического банка.
  • src/BankImpl.kt содержит реализацию операций банка для однопоточного случая. Данная реализация небезопасна для использования из нескольких потоков одновременно.
    • Альтернативная реализация на Java дана в java/BankImpl.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 в качестве шаблона кода.
  • В заголовке файла, в строке @author впишите вашу фамилию и имя.

Сборка и тестирование

Проект должен собираться и успешно проходить тестирование с помощью команды ./gradlew test. При этом автоматически будут запущены следующие тесты:

  • FunctionalTest проверяет базовую корректность работы операций банка.
  • MTStressTest проверяет основные аспекты корректности работы банка при множестве одновременно работающих потоков исполнения.
  • LinearizabilityTest проверяет все аспекты корректности работы банка и линеаризуемость операций, сравнивая различные варианты одновременного выполнения операций с различными вариантами их перестановки на модельной однопоточной реализации.
  • CodeTest делает базовую проверку структуры кода на соответствие заданию.

Исходная реализация проходит только FunctionalTest, но не проходит многопоточные тесты и тест на структуру кода (нет поля lock). Все тесты кроме CodeTest будут проходить, если у каждого метода класса BankImpl написать аннотацию @Synchronized (ключевое слово synchronized в Java), тем самым сделав грубую блокировку. Однако задание требует применение тонкой, а не грубой, блокировки.