Если вы используете ключи SoftReference
, виртуальная машина будет (сильно) смещена по отношению к недавно полученным объектам. Однако было бы довольно трудно определить семантику кэширования - единственная гарантия, которую SoftReference дает вам (через WeakReference), состоит в том, что будет очищено до того, как будет выдан OutOfMemoryError
. Для реализации JVM было бы совершенно законно обрабатывать их идентично WeakReferences, после чего вы можете получить кеш, который ничего не кеширует.
Я не знаю, как все работает на Android, но с недавними JVM от Sun можно настроить поведение SoftReference с помощью параметра командной строки -XX: SoftRefLRUPolicyMSPerMB, который определяет количество миллисекунд, в течение которых объект с мягкой доступностью будет сохраняется на МБ свободной памяти в куче. Как вы можете видеть, это будет исключительно трудно получить предсказуемое поведение продолжительности жизни, с добавленной болью, что этот параметр является глобальным для всех мягких ссылок в ВМ и не может быть настроен отдельно для использования отдельными классами SoftReferences (при каждом использовании могут потребоваться разные параметры).
Самый простой способ создать кэш LRU - расширить LinkedHashMap , как описано здесь . Поскольку вам нужна безопасность потоков, самый простой способ расширить это изначально - просто использовать Collections.synchronizedMap в экземпляре этого пользовательского класса для обеспечения безопасного одновременного поведения.
Остерегайтесь преждевременной оптимизации - если вам не нужна очень высокая пропускная способность, теоретически субоптимальные издержки грубой синхронизации вряд ли будут проблемой. И хорошая новость - если профилирование показывает, что вы выполняете слишком медленно из-за сильной конкуренции за блокировку, у вас будет достаточно информации об использовании вашего кэша во время выполнения, чтобы вы могли найти подходящую альтернативу без блокировки (возможно, основанный на ConcurrentHashMap с некоторой ручной обработкой LRU), а не на предположении по его профилю загрузки.