【问题标题】:How to dynamically update a static lookup list如何动态更新静态查找列表
【发布时间】:2013-11-27 10:12:54
【问题描述】:

为简洁起见,以下是对实际问题的简化。如果有什么不清楚的地方请告诉我。

我有以下(伪)代码在一些 java 服务中运行。用户通过服务调用调用“isItemPresent()”(调用频率可能为每秒数千)。

public static Set<String> lookupSet= new HashSet<String>

void init()
{
   //read some million line text file or db and load lookupList
  lookupSet.add("item 2");
  lookupSet.add("item 5");
  lookupSet.add("item 9");
}

boolean isItemPresent(String checkItem)
{
   if(lookupSet.contain(checkItem))
       return true;

   return false;
}

init() 很耗时,需要几秒钟才能完成。该方法仅在应用首次启动时调用一次。

问题:

lookupSet 中的 1 或 2 项每天可以添加或删除几次:有时一天一次,有时一天 50 次。

我想要一种无需重新初始化整个应用程序即可动态更新lookupSet 的方法。更新的方式应该是isItemPresent() 不会为lookUpSet 产生空指针异常。

我想知道是否可以使用更新的项目列表创建一个新的 LookupSet 并将旧的 LookupSet 替换为新的。因此,它不会妨碍isItemPresent() 的操作。 为了实现这一点,我是否需要旋转另一个线程来维护更新的lookupSetLatest,并且通常应用程序的lookupSet 将被更新/交换。

我不担心 LookupSet 更新晚了几纳秒并且 isItemPresent() 会返回错误的结果。我很关键 isItemPresent() 不会中断。

如果需要更多细节,请告诉我。

【问题讨论】:

    标签: java algorithm design-patterns architecture


    【解决方案1】:

    使用并发 Set,如该问题的答案所述:Why there is no ConcurrentHashSet against ConcurrentHashMap

    另外,return lookupSet.contains(checkItem) 比添加 if 语句更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多