【问题标题】:Java rest server: avoid the removal of an item while processing itJava 休息服务器:避免在处理项目时删除它
【发布时间】:2019-08-06 23:58:52
【问题描述】:

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

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

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

如何避免在 API x 中更新项目数据而刚刚调用的 API y 将其删除的情况?

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

谢谢

【问题讨论】:

    标签: java rest arraylist locking synchronized


    【解决方案1】:

    首先使用静态数组列表来跟踪服务调用中的对象并不是一个好主意。您可能希望使用 Terracota 或 ehCache 之类的东西来维护跨服务实现的缓存。这不仅可以让您不必担心您提到的同步问题,还可以为您的实现提供可伸缩性和性能。

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

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

    【讨论】:

    • 感谢您让我了解 ehCache。使用的时候不用担心 API x 会处理 API y 会删除的项目吗?它本身就“令人担忧”吗?我想它仍然需要是静态的。
    • 我已经为ehCache here添加了一个示例代码,你可能想看看。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2013-01-09
    • 2018-12-09
    • 2013-10-15
    相关资源
    最近更新 更多