Какие знаешь способы хранения кэша для многопоточной работы

«Какие знаешь способы хранения кэша для многопоточной работы» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Android есть несколько способов кэширования с поддержкой многопоточности:

  1. LruCache - in-memory кэш с вытеснением по LRU-алгоритму. Потокобезопасен при правильном использовании:
val cache = LruCache<String, Bitmap>(maxSize)
// Доступ из разных потоков требует синхронизации
  1. DiskLruCache - файловый кэш с LRU-политикой. Требует ручной синхронизации:
synchronized(lock) {
    diskCache.get(key)
}
  1. Room - SQLite-обёртка с встроенной поддержкой потоков через аннотации @Insert, @Query и т.д.

  2. Coroutines + Flow - кэширование с реактивным подходом:

fun getData(): Flow<Data> = flow {
    emit(localCache.get()) 
    emit(remoteSource.fetch())
}.flowOn(Dispatchers.IO)
  1. ConcurrentHashMap - для простых случаев, когда нужна thread-safe мапа.

Для сложных сценариев лучше комбинировать in-memory и disk кэширование с продуманной стратегией инвалидации.