我有一个在类中是静态的arrayList。
在每个请求的开头,我删除所有过时的项目:arrayList.entrySet().removeIf(entry -> entry.getValue().isObsolete());
如果项目超过1小时,则删除。这个方法是同步的。
每个API都使用列表中的项目,基于参数。如果它在列表中,则从那里获取它,否则它会创建一个新项并将其添加到列表中。 API使用特定逻辑更新项目的数据。
我如何避免在刚刚调用的API y中更新API x中项目数据的情况,将其删除?
我是否必须同步所有API?我是否必须在每个API的开头锁定arrayList对象?有更好/更清洁的方法吗?
谢谢
首先使用静态数组列表来跟踪服务调用中的对象并不是一个好主意。您可能希望使用Terracota或ehCache之类的东西来维护服务实现中的缓存。这不仅可以让您免于担心您提到的同步问题,而且还可以提供可伸缩性以及实现的性能。
不过,您是否还打算遵循静态Map实现;然后使用Collections.synchronizedList()获取地图的同步表示,并在方法中使用相同的表示。以下是一个示例用法 -
List<String> cacheList = Collections.synchronizedList(new ArrayList<String>());