#492 Неблокирующий кэш с защитой от dirty-read

Компании:
Ozon
Темы:
JavaМногопоточностьКод ревью

Нужно реализовать "кэш", который хранит 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));
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти