我意识到也有类似的问题/答案,但是我似乎找不到确切的答案。
我正在寻找实现一个内存中的缓存,该缓存缓存对DB的调用的结果,该DB正在进行是否存在检查。这种存在检查非常昂贵,并且一旦对象存在于数据库中就永远不会将其删除,因此我只需要一个非常简单的内存中缓存(甚至是进程内缓存)。一旦进行了数据库调用,该过程就会记住该ID的存在性检查结果,因此不应再次调用该数据库。
(也许要提到的另一件事是,如果该对象在数据库中不存在,它将被创建)。
我为此使用了HashSet(java),只是在完成检查/创建后才将ID添加到集合中,但是这是一个高度并发的环境,我不确定HashSet缺少-的含义。线程安全。
该代码仅使用add()和contains()方法(无迭代)。
我并不真的在乎缓存未命中(以及由此导致的额外数据库调用),但是我想知道的是,是否在集合上并发调用add()和contains()的这种模式线程可能导致更多的灾难性错误。
答案 0 :(得分:1)
您可以使用ConcurrentHashMap进行多线程访问和写入操作。如果只需要HashSet,则可以从ConcurrentHashMap派生出ConcurrentHashSet。您可以这样使用。
Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();
答案 1 :(得分:0)
不。如果要在多线程环境中使用Map
,请使用Collections.synchronizedMap(<map object>)
或ConcurrentHashMap.newKeySet();
:
Set<String> concurrentSet = Collections.synchronizedSet(new HashSet<>());
或...
Set<String> concurrentSet = ConcurrentHashMap.newKeySet();