Java 休息服务器:避免在处理项目时删除项目
Java rest server: avoid the removal of an item while processing it
我有一个 arrayList,它在 class 中是静态的。
在每个请求的开头,我删除所有过时的项目:arrayList.entrySet().removeIf(entry -> entry.getValue().isObsolete());
如果该项目早于 1 小时,则完成删除。此方法已同步。
每个 API 根据参数使用列表中的一个项目。如果它在列表中,则从那里获取它,否则它会创建一个新项目并将其添加到列表中。 API 以一定的逻辑更新项目的数据。
如何避免在 API x 中更新某个项目的数据而刚刚调用的 API y 删除它的情况?
我必须同步所有 API 吗?我是否必须在每个 API 的开头锁定 arrayList 对象?有 better/cleaner 的方法吗?
谢谢
首先使用静态数组列表跨服务调用跟踪对象并不是一个好主意。您可能希望使用 Terracota 或 ehCache 之类的东西来维护跨服务实现的缓存。这不仅可以让您免于担心您提到的同步问题,还可以提供可扩展性以及实现的性能。
尽管如此,您仍然应该打算遵循静态 Map 实现;然后使用 Collections.synchronizedList() 获取地图的同步表示,并在您的方法中使用相同的表示。以下是示例用法 -
List<String> cacheList = Collections.synchronizedList(new ArrayList<String>());
我有一个 arrayList,它在 class 中是静态的。
在每个请求的开头,我删除所有过时的项目:arrayList.entrySet().removeIf(entry -> entry.getValue().isObsolete());
如果该项目早于 1 小时,则完成删除。此方法已同步。
每个 API 根据参数使用列表中的一个项目。如果它在列表中,则从那里获取它,否则它会创建一个新项目并将其添加到列表中。 API 以一定的逻辑更新项目的数据。
如何避免在 API x 中更新某个项目的数据而刚刚调用的 API y 删除它的情况?
我必须同步所有 API 吗?我是否必须在每个 API 的开头锁定 arrayList 对象?有 better/cleaner 的方法吗?
谢谢
首先使用静态数组列表跨服务调用跟踪对象并不是一个好主意。您可能希望使用 Terracota 或 ehCache 之类的东西来维护跨服务实现的缓存。这不仅可以让您免于担心您提到的同步问题,还可以提供可扩展性以及实现的性能。
尽管如此,您仍然应该打算遵循静态 Map 实现;然后使用 Collections.synchronizedList() 获取地图的同步表示,并在您的方法中使用相同的表示。以下是示例用法 -
List<String> cacheList = Collections.synchronizedList(new ArrayList<String>());