Java rest server: избегайте удаления элемента во время его обработки - PullRequest
0 голосов
/ 15 марта 2019

У меня есть arrayList, который является статическим в классе.

В начале каждого запроса я удаляю все устаревшие элементы: arrayList.entrySet().removeIf(entry -> entry.getValue().isObsolete()); Удаление выполняется, если элемент старше 1 часа.этот метод синхронизирован.

Каждый API использует элемент из списка на основе параметра.Если он находится в списке, он берет его оттуда, в противном случае он создает новый элемент и добавляет его в список.API обновляет данные элемента с определенной логикой.

Как можно избежать ситуации, когда я обновляю данные элемента в API x, в то время как API y, который только что был вызван, удаляет его?

Нужно ли синхронизировать все мои API?Нужно ли блокировать объект arrayList в начале каждого API?Есть ли лучший / более чистый способ сделать это?

Спасибо

1 Ответ

1 голос
/ 16 марта 2019

Во-первых, использование списка статических массивов для отслеживания объектов через вызовы служб не очень хорошая идея.Возможно, вы захотите использовать что-то вроде Terracota или ehCache для поддержки кэша в ваших реализациях сервиса.Это не только избавит вас от беспокойства по поводу упомянутых вами проблем с синхронизацией, но также повысит масштабируемость и производительность вашей реализации.

Тем не менее вы все равно должны следовать статической реализации Map;затем используйте Collections.synchronizedList () для получения синхронизированного представления вашей карты и используйте его в своих методах.Ниже приведен пример использования -

List<String> cacheList = Collections.synchronizedList(new ArrayList<String>());
...