これは基本的にthisまたはthis、またはその点で他の多くの続きです。
私の質問はおそらく単純です。ある値のリーダーとライターの両方で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
。これはおそらく明らかですが、見逃しているようです。