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

我意识到对此有类似的问题/答案,但我似乎无法找到我正在寻找的东西。


我正在寻求实现一个内存缓存,它缓存对正在执行存在性检查的数据库的调用结果。这种存在性检查非常昂贵,一旦对象存在于数据库中,它就永远不会被删除,所以我只需要一个非常简单的内存缓存(甚至是进程内缓存)。一旦进行了数据库调用,进程就会记住该 ID 存在性检查的结果,并且不应再次调用数据库。


(也许要提到的另一件事是,如果数据库中不存在该对象,它将被创建)。


我正在为此使用 HashSet (java),并在检查/创建完成后将 ID 添加到集合中,但这是一个高度并发的环境,我不确定 HashSet 缺乏线程安全性的影响。


该代码仅使用 add() 和 contains() 方法(无迭代)。


我真的不关心这里和那里的缓存未命中(以及由此产生的额外数据库调用),但我想知道的是,在并发线程中调用 add() 和 contains() 的这种模式是否会导致到更灾难性的错误。


眼眸繁星
浏览 138回答 2
2回答

潇湘沐

您可以使用 ConcurrentHashMap 进行多线程访问和写入操作。如果只需要 HashSet,可以从 ConcurrentHashMap 派生 ConcurrentHashSet。你可以这样使用。Set<String>&nbsp;myConcurrentSet&nbsp;=&nbsp;ConcurrentHashMap.newKeySet();

繁花如伊

否。如果您想Map在多线程环境中使用 a,请使用Collections.synchronizedMap(<map object>)or&nbsp;ConcurrentHashMap.newKeySet();:Set<String>&nbsp;concurrentSet&nbsp;=&nbsp;Collections.synchronizedSet(new&nbsp;HashSet<>());要么...Set<String>&nbsp;concurrentSet&nbsp;=&nbsp;ConcurrentHashMap.newKeySet();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java