我意识到对此有类似的问题/答案,但我似乎无法找到我正在寻找的东西。我正在寻求实现一个内存缓存,它缓存对正在执行存在性检查的数据库的调用结果。这种存在性检查非常昂贵,一旦对象存在于数据库中,它就永远不会被删除,所以我只需要一个非常简单的内存缓存(甚至是进程内缓存)。一旦进行了数据库调用,进程就会记住该 ID 存在性检查的结果,并且不应再次调用数据库。(也许要提到的另一件事是,如果数据库中不存在该对象,它将被创建)。我正在为此使用 HashSet (java),并在检查/创建完成后将 ID 添加到集合中,但这是一个高度并发的环境,我不确定 HashSet 缺乏线程安全性的影响。该代码仅使用 add() 和 contains() 方法(无迭代)。我真的不关心这里和那里的缓存未命中(以及由此产生的额外数据库调用),但我想知道的是,在并发线程中调用 add() 和 contains() 的这种模式是否会导致到更灾难性的错误。
2 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
您可以使用 ConcurrentHashMap 进行多线程访问和写入操作。如果只需要 HashSet,可以从 ConcurrentHashMap 派生 ConcurrentHashSet。你可以这样使用。
Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();
繁花如伊
TA贡献2012条经验 获得超12个赞
否。如果您想Map
在多线程环境中使用 a,请使用Collections.synchronizedMap(<map object>)
or ConcurrentHashMap.newKeySet();
:
Set<String> concurrentSet = Collections.synchronizedSet(new HashSet<>());
要么...
Set<String> concurrentSet = ConcurrentHashMap.newKeySet();
添加回答
举报
0/150
提交
取消