将 ConcurrentHashMap 用于余额存储之类的事情是否安全

Is it safe to use ConcurrentHashMap for things like balance storage

美好的一天,我正在查看 Java8 中 ConcurrentHashMap(CHM) 的源代码,发现方法 get 是无锁的。它只是从节点数组中进行易失性读取,以便从主内存中读取最新值。 假设我有两个线程使用相同的键从地图读取和写入。使用无锁方法 reader 线程不会等待 writer 将更新值。在这种情况下,我不能将 CHM 用于余额存储之类的事情,因为 reader 必须等待 writer 才能看到最新的余额。如果 CHP 真的以这种方式工作(reader 不等待写入器)那么 Java 核心是否提供了一个映射实现,它使用诸如 ReadWriteLock 之类的东西来进行获取和放置操作?就像当 Map 在特定段上进行获取时,它会获取该段上的读锁,这不会阻止该段的其他 readers。并且 put 将获取该段的写锁,这将阻塞该段的 readers

当 reader 和 writer 都试图访问同一个 volatile 位置时,将发生以下两种情况之一:要么 reader 读取该值,然后 writer 将更新它,或者 writer 将首先更新值,然后 reader 将读取它。

如果使用锁也是同样的道理。如果写入受锁保护,则读取易变值时不需要 ReadWriteLock。无论使用何种同步方法,一旦一个值被读取,它就可以被另一个线程修改。

对于你描述的场景(余额),临界区是read-operate-write,需要加锁,或者atomic add。