Skip to content

Latest commit

 

History

History

fine-grained-bank

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

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

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

  • Bank.java содержит интерфейс для гипотетического банка.
  • BankImpl.java содержит реализацию операций банка для однопоточного случая. Данная реализация небезопасна для использования из нескольких потоков одновременно.

Необходимо доработать реализую BackImpl так, чтобы она стала безопасной для использования из множества потоков одновременно. Переписывать реализацию на Kotlin нельзя.

  1. Для реализации необходимо использовать тонкую блокировку. Синхронизация должна осуществляться для каждого счета по отдельности. Добавьте поле lock типа java.util.concurrent.locks.Lock (интерфейс для примитива блокировки) в класс BankImpl.Account и используйте класс java.util.concurrent.locks.ReentrantLock в качестве стандартной реализации.
  2. Для обеспечения линеаризуемости операций должна использоваться двухфазная блокировка для всех операций.
  3. Для избегания ситуации взаимной блокировки (deadlock) необходимо использовать иерархическую блокировку.
  4. Весь код должен содержаться в файле BankImpl.java, изменять другие файлы запрещается.

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

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

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

Обратите внимание, что исходная реализация проходит только FunctionalTest, но не проходит многопоточные тесты. При этом, прохождения тестов недостаточно для зачета за это задание. Тесты будут проходить, если у каждого метода класса BankImpl написать ключевое слово synchronized (проверьте!). Но такая реализации, несмотря на прохождение тестов, не удовлетворяет заданию, которое требует применение тонкой, а не грубой, блокировки.