Questa classe è sicura per i thread?
Sì, lo è.
Il thread 1 chiama setA (100) e immette la funzione ma non ha ancora chiamato a.set (100) e Thread 2 chiama contemporaneamente getA(). È possibile che Thread 2 veda 80?
Sì. Fino a quando il codice della barriera di memoria che sincronizza il campo volatile all'interno di AtomicInteger
non è completo, le condizioni della competizione possono mostrare 80 o 100.
Il thread 1 potrebbe anche immettere il metodo AtomicInteger.set
ed essere prima dell'assegnazione del campo interno e ancora 80 potrebbe essere restituito con il metodo AtomicInteger.get
.
Non ci sono garanzie circa quando i valori verranno aggiornati in altri thread. Ciò che è garantito è quando il get()
viene completato, si ottiene il valore sincronizzato più recente e quando lo set()
viene completato, tutti gli altri thread vedranno gli aggiornamenti.
Non vi è alcuna garanzia sul timing di chiamate getter e setter in thread diversi.