为了账号安全,请及时绑定邮箱和手机立即绑定

在多线程环境中将 HashSet 用作非常简单的缓存是否安全?

在多线程环境中将 HashSet 用作非常简单的缓存是否安全?

眼眸繁星 2022-12-21 10:10:49
我意识到对此有类似的问题/答案,但我似乎无法找到我正在寻找的东西。我正在寻求实现一个内存缓存,它缓存对正在执行存在性检查的数据库的调用结果。这种存在性检查非常昂贵,一旦对象存在于数据库中,它就永远不会被删除,所以我只需要一个非常简单的内存缓存(甚至是进程内缓存)。一旦进行了数据库调用,进程就会记住该 ID 存在性检查的结果,并且不应再次调用数据库。(也许要提到的另一件事是,如果数据库中不存在该对象,它将被创建)。我正在为此使用 HashSet (java),并在检查/创建完成后将 ID 添加到集合中,但这是一个高度并发的环境,我不确定 HashSet 缺乏线程安全性的影响。该代码仅使用 add() 和 contains() 方法(无迭代)。我真的不关心这里和那里的缓存未命中(以及由此产生的额外数据库调用),但我想知道的是,在并发线程中调用 add() 和 contains() 的这种模式是否会导致到更灾难性的错误。
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

您可以使用 ConcurrentHashMap 进行多线程访问和写入操作。如果只需要 HashSet,可以从 ConcurrentHashMap 派生 ConcurrentHashSet。你可以这样使用。

Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();


查看完整回答
反对 回复 2022-12-21
?
繁花如伊

TA贡献2012条经验 获得超12个赞

否。如果您想Map在多线程环境中使用 a,请使用Collections.synchronizedMap(<map object>)or ConcurrentHashMap.newKeySet();

Set<String> concurrentSet = Collections.synchronizedSet(new HashSet<>());

要么...

Set<String> concurrentSet = ConcurrentHashMap.newKeySet();


查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信