将 thread-safe 放入 ConcurrentHashMap 时是否递增当前值?

Is incrementing of current value while putting thread-safe in ConcurrentHashMap?

我想知道当我修改当前值并将其放入 ConcurrentHashMap 时会发生什么。

我有 ConcurrentHashMap (ConncurentHashMap<String, Integer> attendance),其中包含会议厅名称和每个会议厅的访客数量的现有映射。

每次调用 visit(conferenceHallName) 方法都应该增加给定会议厅的访问者数量。每个调用者都是一个线程。

方法如下:

public void visit(String conferenceHallName) {    
   attendance.put(conferenceHallName, attendance.get(conferenceHallName) + 1);    
}

put()是锁定方式,get()不是。但是在这种情况下首先会发生什么:

  1. 线程会用这个映射锁定段,然后计算一个新值,然后放入和释​​放这对我来说是完美的 或
  2. 线程将获取旧值,计算一个新值,然后锁定段并放入,这对我来说意味着不一致,我需要找到解决方法。

如果第二种情况是现实中发生的情况,使用 AtomicInteger 而不是 Integer 会解决我的问题吗?

第二个描述更接近实际发生的情况:线程将以thread-safe方式访问值,用更新后的计数构造一个新的Integer,然后锁定映射,并替换对象。

使用 AtomicInteger 而不是 Integer 将解决问题:

attendance.get(conferenceHallName).getAndIncrement();

这是假设所有 conferenceHallName 键都已在地图中正确设置。