为简便起见,下面简化了实际问题。如果有什么不清楚,请告诉我。
我有以下(伪)代码在一些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与新的LookupSet交换。因此,它不会妨碍isItemPresent()
操作。
为了实现这一点,我是否需要旋转另一个将保持更新lookupSetLatest
的线程,并且应用程序的lookupSet将被更新/交换。
我并不担心LookupSet会延迟几纳秒,isItemPresent()会返回错误的结果。我很关键isItemPresent()不会破坏。
如果需要更多细节,请告诉我。
答案 0 :(得分:0)
使用并发集,如此问题的答案中所述:Why there is no ConcurrentHashSet against ConcurrentHashMap。
此外,return lookupSet.contains(checkItem)
比添加if
语句更有效。