1

これは基本的に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。これはおそらく明らかですが、見逃しているようです。

4

1 に答える 1