将 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()
不是。但是在这种情况下首先会发生什么:
- 线程会用这个映射锁定段,然后计算一个新值,然后放入和释放这对我来说是完美的
或
- 线程将获取旧值,计算一个新值,然后锁定段并放入,这对我来说意味着不一致,我需要找到解决方法。
如果第二种情况是现实中发生的情况,使用 AtomicInteger
而不是 Integer
会解决我的问题吗?
第二个描述更接近实际发生的情况:线程将以thread-safe方式访问值,用更新后的计数构造一个新的Integer
,然后锁定映射,并替换对象。
使用 AtomicInteger
而不是 Integer
将解决问题:
attendance.get(conferenceHallName).getAndIncrement();
这是假设所有 conferenceHallName
键都已在地图中正确设置。
我想知道当我修改当前值并将其放入 ConcurrentHashMap
时会发生什么。
我有 ConcurrentHashMap
(ConncurentHashMap<String, Integer> attendance
),其中包含会议厅名称和每个会议厅的访客数量的现有映射。
每次调用 visit(conferenceHallName)
方法都应该增加给定会议厅的访问者数量。每个调用者都是一个线程。
方法如下:
public void visit(String conferenceHallName) {
attendance.put(conferenceHallName, attendance.get(conferenceHallName) + 1);
}
put()
是锁定方式,get()
不是。但是在这种情况下首先会发生什么:
- 线程会用这个映射锁定段,然后计算一个新值,然后放入和释放这对我来说是完美的 或
- 线程将获取旧值,计算一个新值,然后锁定段并放入,这对我来说意味着不一致,我需要找到解决方法。
如果第二种情况是现实中发生的情况,使用 AtomicInteger
而不是 Integer
会解决我的问题吗?
第二个描述更接近实际发生的情况:线程将以thread-safe方式访问值,用更新后的计数构造一个新的Integer
,然后锁定映射,并替换对象。
使用 AtomicInteger
而不是 Integer
将解决问题:
attendance.get(conferenceHallName).getAndIncrement();
这是假设所有 conferenceHallName
键都已在地图中正确设置。