Ответ
В Android есть несколько способов кэширования с поддержкой многопоточности:
- LruCache - in-memory кэш с вытеснением по LRU-алгоритму. Потокобезопасен при правильном использовании:
val cache = LruCache<String, Bitmap>(maxSize)
// Доступ из разных потоков требует синхронизации
- DiskLruCache - файловый кэш с LRU-политикой. Требует ручной синхронизации:
synchronized(lock) {
diskCache.get(key)
}
-
Room - SQLite-обёртка с встроенной поддержкой потоков через аннотации @Insert, @Query и т.д.
-
Coroutines + Flow - кэширование с реактивным подходом:
fun getData(): Flow<Data> = flow {
emit(localCache.get())
emit(remoteSource.fetch())
}.flowOn(Dispatchers.IO)
- ConcurrentHashMap - для простых случаев, когда нужна thread-safe мапа.
Для сложных сценариев лучше комбинировать in-memory и disk кэширование с продуманной стратегией инвалидации.