Итак, вот проблема, которую я пытаюсь решить - у меня есть Объект с двумя целочисленными полями, которые я хочу кэшировать
public class MyObject {
int x;
int y;
....
}
Теперь поле x
- это то, с чем я в основном сопоставляюсь - ноМогут быть дубликаты, в этом случае я хочу вернуться ко второму полю (так что this.x = that.x и this.y = that.y).у может быть только 25 различных значений.Теперь я знаю, что я мог бы просто объединить их в виде строки и использовать их в качестве ключа кеша, но тогда мне пришлось бы попробовать x+[25 possible values]
, чтобы на самом деле определить, не было ли оно в кеше, - кеш пропускает очень дорого.Я думал о том, чтобы попытаться сохранить List<Integer>
в качестве значения кэша для поля x
, а затем, если их было больше единицы, выполнить итерацию вниз по списку и найти совпадение для y
.
Теперь, если я использую ConcurrentList
(или Set, если мне небезразличны дубликаты - давайте пока проигнорируем это), смогут ли несколько потоков добавить к нему и затем вернуть его в кеш без условий гонки?Возможно ли, что Ehcache может вернуть два разных объекта List двум потокам, а затем, когда они добавят свое новое значение в список и попытаются вернуть его в кэш, я могу получить неопределенные результаты?Видите ли вы лучший способ построения этого кэша?
РЕДАКТИРОВАТЬ: Я ценю ответы ниже, но, похоже, все упускают главное.Будет ли это работать?Может ли Ehcache на самом деле вернуть два разных объекта для одного и того же cacheKey (скажем, если объект находился на диске во время вызова и сериализовал его дважды, один раз для каждого вызова).