2009-03-28 12 views
12

C'è qualche differenza nel significato di AtomicIntegerArray e AtomicInteger[]? E quale è più veloce da usare? (l'unica cosa che ho notato è che richiede molto meno spazio, ma significa che ogni ricontrollo controlla i limiti dell'array, in modo da rallentarlo?)AtomicIntegerArray vs AtomicInteger []

Modifica: in uno scenario in cui la matrice è pre inizializzato.

risposta

8

AtomicInteger[] richiederà un oggetto per elemento. AtomicIntegerArray richiede solo l'oggetto AtomicIntegerArray e un oggetto array. Quindi usa quest'ultimo se possibile.

Il costo del controllo dei limiti è abbastanza piccolo anche per gli array normali. Ciò che potrebbe essere significativo è che l'accesso ai dati nella stessa linea di cache da più processori può causare problemi di prestazioni significativi. Pertanto, può aiutare gli oggetti separati o evitare deliberatamente elementi vicini di un array.

+0

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). –

+0

tnx (non è stato visualizzato il secondo paragrafo) Quindi potrebbe essere utile non creare tutti gli oggetti contemporaneamente? (o con qualche ordine casuale?) – Sarmun

+0

(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. –

0

Sono d'accordo con il primo comma di Tom Hawin ...

AtomicInteger [] richiederà un oggetto per ogni elemento. AtomicIntegerArray richiede solo l'oggetto AtomicIntegerArray e un oggetto array. Quindi usa quest'ultimo se possibile.

... ma si dovrebbe anche notare che AtomicInteger [] non è thread-safe. Nello specifico, i riferimenti dell'array ai singoli oggetti AtomicInteger possono essere corretti o non essere corretti se si accede da più thread. Tuttavia, la sincronizzazione dell'accesso sull'oggetto dell'array eliminerà questo problema.

+2

Il punto su Atomic * è che si evita la sincronizzazione. Il metodo presunto di utilizzo di AtomicInteger [] consiste nel creare tutti gli AtomicIntegers una sola volta e solo dopo pubblicare l'array in modo sicuro. –

+1

Sono d'accordo. Non sto sostenendo l'uso di AtomicInteger [], notando solo la differenza, che è di che cosa si trattava :) –

4
  • AtomicInteger [] è un array di interi thread-safe.
  • AtomicIntegerArray è una matrice thread-safe di numeri interi.
2

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.

+0

Al prezzo della bassa velocità per le operazioni di aggiornamento (anche se ottenere e impostare sono veloci). A volte vale la pena estendersi da Atomic * come un hack per salvare la memoria. –

Problemi correlati