Java休息服务器: avoid the removal of an item while processing it

标签 java rest arraylist locking synchronized

我有一个在类中是静态的 arrayList。

在每个请求的开头,我删除所有过时的项目:arrayList.entrySet().removeIf(entry ->entry.getValue().isObsolete()); 如果该项目的时间超过 1 小时,则会完成删除。该方法是同步的。

每个 API 根据参数使用列表中的一项。如果它在列表中,则从那里获取它,否则它会创建一个新项目并将其添加到列表中。 API按照一定的逻辑更新项目的数据。

如何避免出现以下情况:更新 API x 中某个项目的数据,而刚刚调用的 API y 却将其删除?

我必须同步所有 API 吗?我是否必须在每个 API 的开头锁定 arrayList 对象?有更好/更干净的方法吗?

谢谢

最佳答案

首先,使用静态数组列表来跟踪服务调用之间的对象并不是一个好主意。您可能需要使用 Terracota 或 ehCache 之类的东西来维护跨服务实现的缓存。这不仅使您不必担心您提到的同步问题,而且还可以实现可扩展性以及实现的性能。

尽管如此,您仍然应该打算遵循静态 Map 实现;然后使用 Collections.synchronizedList() 获取 map 的同步表示,并在您的方法中使用相同的表示。以下是示例用法 -

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

关于Java休息服务器: avoid the removal of an item while processing it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55190495/

相关文章:

java - 如何使用Android接收特定 radio 频率

node.js - 我应该使用什么 HTTP 动词来请求一些新数据但不将它们保存在数据库中?

java - 嵌套 for 循环打印数组列表中的一组值

javascript - AngularJS 的 REST 服务缓存策略

在 Presto 之上休息服务

java - 如何阅读这个: public <T> T[] toArray(T[] array);

java - 我什么时候需要创建列表的新实例?

java - testng.xml 编译未包含在其中的类

java - 如何将作业对象实例传递给 quartz 调度程序

java - 如何正确格式化 Hibernate 实体以与 ember-data 一起使用?