Java 在ConcurrentHashMap中放置线程时,当前值的增量是否安全?
我想知道在将当前值放入Java 在ConcurrentHashMap中放置线程时,当前值的增量是否安全?,java,concurrenthashmap,Java,Concurrenthashmap,我想知道在将当前值放入ConcurrentHashMap时修改它会发生什么 我有ConcurrentHashMap(ConncurentHashMap出席人数)以及会议厅名称和每个会议厅的访客人数的现有映射 每次调用visit(conferenceHallName)方法都会增加给定会议厅的访客数量。每个调用程序都是一个线程 因此,方法如下: public void visit(String conferenceHallName) { attendance.put(conferenc
ConcurrentHashMap
时修改它会发生什么
我有ConcurrentHashMap
(ConncurentHashMap出席人数
)以及会议厅名称和每个会议厅的访客人数的现有映射
每次调用visit(conferenceHallName)
方法都会增加给定会议厅的访客数量。每个调用程序都是一个线程
因此,方法如下:
public void visit(String conferenceHallName) {
attendance.put(conferenceHallName, attendance.get(conferenceHallName) + 1);
}
put()
是锁定方法,get()
不是。但在这种情况下首先会发生什么:
如果第二个场景是实际发生的情况,那么使用
AtomicInteger
而不是Integer
是否可以解决我的问题?第二个描述更接近实际发生的情况:线程将以线程安全的方式访问值,使用更新的计数构造一个新的Integer
,然后锁定映射,并替换该对象
使用AtomicInteger
而不是Integer
将解决以下问题:
attendance.get(conferenceHallName).getAndIncrement();
这是假设所有
conferenceHallName
键在映射中都已正确设置。如果您使用的是Java 8,则可以通过attention.merge(conferenceHallName,1,Integer::sum)获得正确的行为。
。