Al di sotto, AtomicInteger e AtomicIntegerArray utilizzano in genere le stesse API di basso livello per eseguire operazioni di lettura, scrittura e altre operazioni CAS. (Ad esempio, OpenSDK 7 utilizza sun.misc.Unsafe
per eseguire le operazioni CAS in entrambe le classi.) Quindi c'è poco vantaggio sulle prestazioni nell'utilizzo di AtomicInteger []. Come hai già notato, l'uso di AtomicIntegerArray fa ha notevoli vantaggi di memoria.
Da un punto di vista pratico, l'utilizzo del successivo ti libera dal dover costruire anche tutte le istanze AtomicInteger. Ricorda che non puoi ingenuamente destinare quelle pigramente a causa di motivi di concorrenza; dovrai pre-allocare o utilizzare un meccanismo di pubblicazione sicuro. Quindi oltre ai vantaggi della memoria, il tuo codice è più pulito.
In modo simile, se si dispone di un gruppo di oggetti con membri AtomicInteger, ad esempio:
class ReadCounter {
private final String _fileName;
private final AtomicInteger _readCount;
...
}
private final Map<String, ReadCounter> _counterByName = ...;
Quindi è possibile ottenere miglioramenti memoria simili modellando la variabile membro _readCount
come volatile int
e utilizzando AtomicIntegerFieldUpdater
.
fonte
2009-03-28 16:39:29
A chi importa dei controlli sui limiti? Se si guarda il (apparente) codice sorgente per, diciamo, getAndSet esegue il calcolo dell'indirizzo sia per get che per compareAndSet (sebbene peggio di questo, la maggior parte dei processori può fare get-and-set senza cas). –
tnx (non è stato visualizzato il secondo paragrafo) Quindi potrebbe essere utile non creare tutti gli oggetti contemporaneamente? (o con qualche ordine casuale?) – Sarmun
(Ho fatto una modifica rapida). La creazione di oggetti in momenti diversi non sarà di aiuto in quanto il GC li riorganizzerà. Una delle classi in java.util.concurrent arriva ad aggiungere un sacco di padding (nelle versioni recenti). Dovrebbe essere più semplice e più chiaro aggiungere elementi di riempimento a AtomicIntegerArray, basta spostare a sinistra. –