Come indicato da altri, AtomicReference<Integer>
utilizza == per confrontare gli oggetti. Pertanto, compareAndSet(expect, update)
aggiornerà il riferimento iniziale solo se expect
è uguale all'oggetto memorizzato nel riferimento di riferimento atomico utilizzando ==.
Può causare alcuni bug insidiosi se si utilizza AtomicReference
per tipi numerici, ad esempio Integer
o Long
. Si noti che i costruttori statici di tali classi (ad esempio, Integer.valueOf(int value)
) restituiscono oggetti memorizzati nella cache per valori piccoli. In altre parole, due chiamate diverse a Integer.valueOf(5)
restituiscono la stessa istanza di Integer
. È sicuro, poiché le classi sono immutabili. Nel risultato, se si utilizza AtomicReference<Integer>
mentre si dovrebbe usare davvero AtomicInteger
, potrebbe funzionare bene per questi piccoli numeri, perché == potrebbe effettivamente confrontare gli stessi oggetti. Diventa peggio solo quando inizi a gestire valori più alti ad un certo punto.
Riassumendo, utilizzando AtomicInteger
è molto più sicuro per operazioni numerico :)
Vale la pena sottolineare anche che gli oggetti interi auto-boxed nell'intervallo da -127 a 128 sono internati e che il loro == restituirà true mentre i numeri interi al di fuori di questo intervallo non lo saranno. Gli interi creati con 'new Integer (3)' ovviamente non avranno la stessa identità. Questo può causare ogni sorta di comportamenti sorprendenti. –
@ JedWesley-Smith - Punto eccellente. Secondo l'API, anche i valori al di fuori dell'intervallo _might_ possono essere memorizzati nella cache. Quindi, per peggiorare le cose, i "comportamenti sorprendenti" possono essere diversi su diverse piattaforme Java. –
Esatto, si tratta di un hack non documentato su cui non si dovrebbe fare affidamento. –