【发布时间】:2021-06-03 16:57:42
【问题描述】:
我的问题可能很简单,如果我只使用ConcurrentHashMap::compute,在读者和作者中都有一定的价值,这是否足以确保可见性?
我知道compute 方法:
整个方法调用都是原子执行的
这足以保证可见性吗?具体来说,关于happens-before,真正的规范/文档是否明智?为了简化我的问题,这里有一个例子:
static class State {
private int age;
int getAge() {
return age;
}
State setAge(int age) {
this.age = age;
return this;
}
}
和:
// very simplified, no checks
static class Holder {
private static final ConcurrentHashMap<String, State> CHM = new ConcurrentHashMap<>();
public State read(String key) {
return CHM.compute(key, (x, y) -> y);
}
public State write(String key, int age) {
return CHM.compute(key, (x, y) -> y.setAge(y.getAge() + age));
}
}
没有人可以访问CHM,只能通过Holder工作。
对我来说答案显然是肯定的,这是安全的,所有读者都会看到最新的write 方法的结果。我只是无法将这些点与ConcurrentHashMap 的文档联系起来,这很可能是显而易见的,但我似乎错过了。
【问题讨论】:
-
我认为这是线程安全保证所暗示的。
-
你已经回到了这个问题explained here。问题是,
read的调用者是做什么的?它将看到“最新write的结果”,但哪个写入是最新写入?如果没有任何定义的顺序,可能还没有发生任何事情,并且所有这些都可能正在运行,同时与read方法的调用者同时运行。 -
是的,它的可见性已经足够了。我认为这对于能见度来说有点太多了。对于
read()方法,您可以使用CHM.get()并从此过上幸福的生活。 -
@TamasRev 不,你不能使用
get。我链接的 cmets 和最初的问题讨论的范围更广。 -
@Holger 你介意发布答案吗?我终于明白你的意思了。
标签: java multithreading concurrenthashmap happens-before