#492 Неблокирующий кэш с защитой от dirty-read
Нужно реализовать "кэш", который хранит long[] по индексу.
Размер кэша - 10 элементов.
Реализует два метода:
-
void bulkUpdate(Updater updater)- обновляет значения пачкой в текущем состоянии кэша in-place; -
long[] bulkRead(int[] indices)- получает пачкой необходимые лонги из кэша по индексам.
Условия:
-
Есть
N(константа) потоков, которые читают кэш; - Есть 1 поток, который кэш обновляет;
-
Читатель должен быть защищён от грязного чтения (dirty-read). То есть, если происходит мутация
A -> B, то читатель должен видеть только конечное состояние (AилиB), но никогда промежуточное; - Чтение должно быть неблокирующим;
- Запись может быть блокирующей;
-
Входные данные можно считать всегда валидными (не
null, индексы только от 0 до 9 включительно).
interface Cache {
// Метод для обновления каша через мутацию
void bulkUpdate(Updater updater);
// Метод, который принимает индексы для чтения
long[] bulkRead(int[] indices);
}
// Интерфейс, через который пользователи каша обновляют его
interface Updater {
void updateCurrentState(long[] currentCacheState);
}
public void main() {
var cache = new SimpleCache();
cache.bulkUpdate(arr -> { arr[0] = 123; arr[1] = 456; });
var cacheValues = cache.bulkRead(new int[]{1, 2});
System.out.println(Arrays.toString(cacheValues));
}
Разбор вопроса
Войди, чтобы начать диалог
Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти
Доступно с Premium
Это лишь одно из решений, доступных с Premium. А ещё:
- 250+ продвинутых лекций
- 1300+ практических заданий
- 500+ решений задач с реальных собеседований
- Именные сертификаты Java Hub
- Расширенный доступ к AI-ментору