繁体   English   中英

JSF ApplicationScoped HashMap-ConcurrentHashMap

[英]JSF ApplicationScoped HashMap - ConcurrentHashMap

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

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

例如:

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

在启动过程中,每个Sub-Hash-Map都初始化为空(单线程)。 保证每个Sub-Hash-Map都只能被修改(“投入”,永不删除)并且不能被beein取代。

保证在任何时候都只能由单个线程对子哈希映射执行写访问,但是如上面的示例所示,可能有2个线程同时修改两个不同的子映射)

我们不使用SessionScope,因为某些信息也需要公开给其他会话(即Teamlead应该能够看到值)

到目前为止,还没有并发问题,但是并发总是很难正确地“测试”,因为它主要取决于整个系统的负载和大约在同一时间执行的动作。

遵循此线程: 是否保证ConcurrentHashMap.get()被其他线程看到先前的ConcurrentHashMap.put()? 我假设,对内部哈希图使用并发哈希图将完全确保从不同线程同时在同一图上使用putget不会出现问题。

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

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

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

同样,您还需要考虑外部地图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM