Bietet ConcurrentMap.remove () eine Flanke vor dem Eintreten, bevor get () null zurückgibt?

Sind Aktionen in einem Thread vor dem Aufrufen vonConcurrentMap.remove() garantiert zu happen-before Aktionen nach dem Entfernen aus einem anderen Thread?

Dokumentatio sagt dies in Bezug auf Objekte, die in die Sammlung gestellt wurden:

Aktionen in einem Thread vor dem Platzieren eines Objekts in einer gleichzeitigen Auflistung werden ausgeführt, bevor Aktionen nach dem Zugriff auf oder dem Entfernen dieses Elements aus der Auflistung in einem anderen Thread ausgeführt werden.

Beispielcode:

{
    final ConcurrentMap map = new ConcurrentHashMap();
    map.put(1, new Object());

    final int[] value = { 0 };

    new Thread(() -> {
        value[0]++;
        value[0]++;
        value[0]++;
        value[0]++;
        value[0]++;

        map.remove(1); // A

    }).start();

    new Thread(() -> {
        if (map.get(1) == null) { // B
            System.out.println(value[0]); // expect 5
        }

    }).start();
}

IstA in einem passiert-vor Beziehung mitB? Sollte das Programm daher nur, wenn überhaupt, 5 ausgeben?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage