Проект включает в себя следующие исходные файлы:
Set.javaсодержит интерфейс множества.SetImpl.javaсодержит реализацию множества на основе односвязного списка для однопоточного случая. Данная реализация небезопасна для использования из нескольких потоков одновременно.
Необходимо доработать реализую SetImpl так, чтобы она стала безопасной для использования из множества потоков одновременно.
Используйте неблокирующую синхронизацию для всех операций.
Вместо AtomicMarkableReference предлагается в поле next хранить либо Node (когда флаг removed == false), либо специально добавленный class Removed { final Node next; } (когда removed == true).
Таким образом, чтобы проверить, выставлен ли флаг removed, необходимо написать next instanceof Removed.
Посмотрите на реализацию AtomicMarkableReference, она примерно так и сделана.
Для тестирования используйте команду mvn test. При этом автоматически будут запущены следующие тесты:
FunctionalTest.javaпроверяет базовую корректность множества.LinearizabilityTest.javaпроверяет реализацию множества на корректность в многопоточной среде.
Обратите внимание, что тесты не покрывают все возможные ошибки синхронизации, поэтому прохождение тестов не означает корректность реализации.
- Все атомарные операции должны выполняться при помощи примитивов из библиотеки
kotlinx.atomicfu. - Использования любых примитивов из пакета
java.util.concurrent.*,synchronizedметодов и блоков запрещены. - Разрешается редактирование только файла
SetImpl.java.