【发布时间】:2016-11-23 14:08:44
【问题描述】:
在我的应用程序中,我需要维护一个内存中的HashMap,它存储userIds 及其score 的列表。
有一个 Writer Thread 根据业务逻辑更新用户的分数。并且许多Reader Threads从这张地图中读取了用户的score,即map.get(userId)。
userIds 的列表是静态的,即没有新用户添加到地图中。
根据 JavaDoc If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.
我没有进行任何结构更改(没有添加/删除)。对于这样的用例,我是否需要使用 ConcurrentHashMap 或任何其他 Synchronization 构造?
【问题讨论】:
-
如果没有适当的同步,无法保证“读取”线程将读取正确的值
-
Race condition 仍然会发生,但在您的情况下不会发生 ConcurrentModificationException 。为了研究良好的并发实践,我推荐这个资源:jcip.net
-
您可以拥有
userId->wrapper的映射,其中包装器包含volatile scrore。简单地读写score就可以了。
标签: java multithreading hashmap synchronization