В рамках данного задания необходимо с помощью универсальной 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
проверяет что в вашем решении не используются блокировки.
Выполняйте задание в этом репозитории. Инструкции по сдаче заданий находятся в этом документе.