将线程安全放入ConcurrentHashMap时是否正在增加当前值?

时间:2019-06-04 18:56:43

标签: java concurrenthashmap

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

我有ConcurrentHashMapConncurentHashMap<String, Integer> attendance),其中包含会议厅名称和到场人数的现有映射。

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

所以这是方法:

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

put()是锁定方法,get()不是锁定方法。但是在这种情况下首先发生的事情:

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

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

1 个答案:

答案 0 :(得分:3)

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

使用AtomicInteger代替Integer将解决此问题:

attendance.get(conferenceHallName).getAndIncrement();

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