Java Concurrency - Veröffentlichen unveränderlicher Objekte (Java Concurrency in der Praxis)

In Java Concurrency In Practice gab der Autor dies an

Unveränderliche Objekte können über einen beliebigen Mechanismus veröffentlicht werdenUnveränderliche Objekte können von jedem Thread ohne zusätzliche Synchronisierung sicher verwendet werden, auch wenn die Synchronisierung nicht zum Veröffentlichen verwendet wird.

Bedeutet dies, dass die folgenden Redewendungen sicher sind, unveränderliche Objekte zu veröffentlichen?

public static List<ImmutableObject> list = new ArrayList<ImmutableObject>();

// thread A invokes this method first
public static void methodA () {
    list.add(new ImmutableObject());
}

// thread B invokes this method later
public static ImmutableObject methodB () {
    return list.get(0);
}

Würde es ein Datenrennen geben? (Dies bedeutet, dass Thread B das unveränderliche Objekt in der von Thread A hinzugefügten Liste möglicherweise nicht sehen kann.)

Vielen Dank.

Darüber hinaus sagte der Autor, dass der folgende Code sicher ist, wenn die Ressource unveränderlich ist.

@NotThreadSafe
public class UnsafeLazyInitialization {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null)
            resource = new Resource();  // unsafe publication
        return resource;
    }
}

Abschnitt 16.3 Die Garantie für die Initialisierungssicherheit ermöglicht, dass ordnungsgemäß erstellte unveränderliche Objekte ohne Synchronisierung sicher für mehrere Threads freigegeben werden, unabhängig davon, wie sie veröffentlicht werden, selbst wenn sie mithilfe eines Datenrennens veröffentlicht werden. (Das bedeutet, dassunsafeLazyInitialization ist eigentlich sicher wennResource ist unveränderlich.)

Für den 2. Teil dieser Frage wird in einer anderen Frage ausführlich darauf eingegangen (KlickHier)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage