我想知道在将当前值放入ConcurrentHashMap
时修改当前值会发生什么。
我有ConcurrentHashMap
(ConncurentHashMap<String, Integer> attendance
),其中包含会议厅名称和到场人数的现有映射。
每次调用visit(conferenceHallName)
方法都应该增加给定会议厅的访客数量。每个调用者都是一个线程。
所以这是方法:
public void visit(String conferenceHallName) {
attendance.put(conferenceHallName, attendance.get(conferenceHallName) + 1);
}
put()
是锁定方法,get()
不是锁定方法。但是在这种情况下首先发生的事情:
如果第二种情况是现实情况,会使用AtomicInteger
而不是Integer
解决我的问题吗?
答案 0 :(得分:3)
第二个描述更接近实际发生的情况:线程将以线程安全的方式访问该值,使用更新后的计数构造新的Integer
,然后锁定映射并替换对象。 / p>
使用AtomicInteger
代替Integer
将解决此问题:
attendance.get(conferenceHallName).getAndIncrement();
这是假设在地图中正确设置了所有conferenceHallName
键。