Я хочу коллекции в Java, которая:Многопоточный объект → карта кэша объектов в Java?
- отображает произвольные
Object
с доObject
с (неString
или иначе ограничены ключи только) - будет использоваться в качестве кэша; если ключ не находится в кэше, значение будет вычислено (это не должно быть встроено в коллекцию)
- будет доступны из нескольких потоков одновременно
- никогда не были элементы удалены из него
- должен быть очень эффективный для чтения (кеш-хит); не обязательно эффективно писать (ошибка кэша)
Это нормально, если кеш пропускает одновременно в нескольких потоках, вызывают избыточные вычисления; типичным случаем является то, что кеш в основном заполняется одним потоком сначала.
A Блок вокруг небезопасной хеш-таблицы не соответствует критерию эффективности чтения. Потоковые локальные кэши будут простыми, но означают, что новые потоки дороги, поскольку у них есть полные копии кеша.
Предпочитаются встроенные модули Java 1.5 или один или несколько классов, которые мы можем скопировать в наш проект, лицензированный MIT, а не большие внешние библиотеки.
После редактирования 3 раза, это, наконец, правильно;) В зависимости от того, как реализован ваш метод CalculateValueForKey, это должно быть довольно быстро даже при записи (и никогда не будет блокироваться). – Martin
исправил небольшую ошибку с помощью putIfAbsent, теперь она использует рекурсию, немного испугавшись переполнения стека, вы можете превратить значение == null бит в цикл тривиально :) – Martin
Почему бы не сделать что-то вроде: Object toCache = CalculateValueForKey (foo); Object atomicPut = table.putIfAbsent (ключ, toCache); return atomicPut == null? toCache: atomicPut; Нет необходимости в рекурсии –