Współbieżność Java - publikowanie obiektów niezmiennych (współbieżność Java w praktyce)

W współbieżności Java w praktyce autor stwierdził

Obiekty niezmienne można publikować za pomocą dowolnego mechanizmuObiekty niezmienne mogą być bezpiecznie używane przez dowolny wątek bez dodatkowej synchronizacji, nawet jeśli synchronizacja nie jest używana do ich publikowania.

Czy to oznacza, że ​​następujące idiomy są bezpieczne do publikowania niezmiennych obiektów?

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);
}

Czy będzie jakiś wyścig danych? (co oznacza, że ​​wątek B może nie być w stanie zobaczyć obiektu niezmiennego na liście dodanej przez wątek A)

Dziękuję Ci bardzo.

Co więcej, autor powiedział, że poniższy kod jest bezpieczny, jeśli zasób jest niezmienny.

@NotThreadSafe
public class UnsafeLazyInitialization {
    private static Resource resource;

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

Sekcja 16.3 Gwarancja bezpieczeństwa inicjalizacji pozwala na bezpieczne skonstruowanie niezmiennych obiektów, które mogą być bezpiecznie współdzielone między wątkami bez synchronizacji, niezależnie od tego, jak są publikowane, nawet jeśli są publikowane przy użyciu wyścigu danych. (To znaczy żeunsafeLazyInitialization jest rzeczywiście bezpieczny, jeśliResource jest niezmienny.)

W drugiej części tego pytania omówiono je szczegółowo w innym pytaniu (kliknijtutaj)

questionAnswers(4)

yourAnswerToTheQuestion