gpt4 book ai didi

java - JSF ApplicationScoped HashMap - ConcurrentHashMap

转载 作者:行者123 更新时间:2023-12-01 11:47:14 24 4
gpt4 key购买 nike

在应用程序范围的 bean 内,我们有一个 HashMap ,它为每个用户保存一些计数器(只是暂时的,不保存在任何地方)每个用户由它自己的子 HashMap 表示:

Map<String, Map<String, Object>> userValues = new HashMap<String, Map<String, Object>>();

例如:

application.getUserValues().get(user.id).put("lastAction", new Date());

每个子 HashMap 在启动期间都被初始化为空(单线程)。每个子 HashMap 保证只能被修改(“放置”,永远不会删除)并且不会被替换。

子 HashMap 上的写访问保证在任何时候仅由单个线程发生,但如上面的示例所示,可能有 2 个线程同时修改两个不同的子映射)

我们没有使用 SessionScope,因为某些信息也需要暴露给其他 session (即团队负责人应该能够看到这些值)

到目前为止,从未出现过并发问题,但并发总是很难正确“测试”,因为它主要取决于整体系统负载和大约同时执行的操作。

关注此线程:Is ConcurrentHashMap.get() guaranteed to see a previous ConcurrentHashMap.put() by different thread?我认为,对内部 HashMap 使用并发 HashMap 将完全确保使用 put 不会出现问题。和get从不同的线程同时在同一张 map 上。

所以最好使用Map<String, ConcurrentHashMap<String, Object>>对吗?

是否还需要使用 ConcurrentHashmap 作为“外部”映射?那张 map 永远不会改变,只有对该 map 的操作才是 get()

最佳答案

如果同一个子映射被多个线程访问,并且它们也写入映射,那么 ConcurrentHashMap 就有意义了。如果他们只是在最初写入一次时读取数据,甚至在多个线程开始之前(例如初始化),那么您就不需要并发HashMap。

同样,您也需要考虑外部 map 。

关于java - JSF ApplicationScoped HashMap - ConcurrentHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29060579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com