В рамках данного задания необходимо с помощью универсальной lock-free конструкции реализовать счетчик с атомарной операцией инкремента на основе объекта консенсуса.
В файле src/AtomicCounter.kt
находится описание интерфейса счетчика, который вам предстоит реализовать.
Вам недо реализовать всего одну операцию:
fun getAndAdd(x: Int): IntВ вашем распоряжении есть класс Consensus<T>, который реализует консенсус на объекте
любого типа T предоставляя единственную операцию:
fun decide(value: T): TВаше решение должно быть в файле src/Solution.(kt|java). Основной класс должен называться Solution.
Шаблоны решений вы найдете здесь:
- На языке Kotlin в файле
src/SolutionTemplateKt.kt - На языке Java в файле
src/SolutionTemplateJava.java
В классе решения вы можете использовать объекты типа Consensus для синхронизации потоков, объекты
типа ThreadLocal для хранения состояния внутри потока, и значения типа Int.
Все поля класса должны быть неизменяемые (val в Kotlin, final в Java).
Массивы использовать нельзя. Для lock-free универсальной конструкции они не нужны.
Также вам наверняка потребуется вспомогательный класс, на который вы так же можете ссылать и на который накладываются
такие же ограничения. Вспомогательные классы должны быть внутри вашего класса решения.
Для проверки вашего решения запустите из корня репозитория:
./gradlew buildна Linux или MacOSgradlew buildна Windows
Тесты:
CorrectnessTestпроверяет последовательную спецификацию и выполнение ограничений описанных в условии.LinearizabilityTestпроверяет линеаризуемость вашего решения.LockFreedomTestпроверяет что в вашем решении не используются блокировки.
Выполняйте задание в этом репозитории. Инструкции по сдаче заданий находятся в этом документе.