2011-10-04 16 views
24

Io uso un numero intero come contatore. Il numero intero sarà aumentato, e sicuramente più di un thread lo aumenterà allo stesso tempo. Il valore di questo contatore viene letto alla fine dell'esecuzione del programma quando nessun altro thread tenterà di accedere al suo valore.È necessaria la sincronizzazione per un contatore di solo incremento?

Suppongo che non sia necessario utilizzare un blocco o alcun tipo di sincronizzazione per questo tipo di contatore di solo incremento. È giusto? Codice in Java se questo fa alcuna differenza.

risposta

59

Se hai appena usato una variabile int o long allora si sarebbe necessità di sincronizzazione - di incremento comporta lettura/incremento-locale/scrittura, che è ben lungi dall'essere un'operazione atomica. (Anche se la variabile è volatile evitare pericoli per modello di memoria di stantio, saresti ancora avere tre operazioni distinte, con la possibilità di vedersi superata tra una qualsiasi coppia di loro.)

Fortunatamente Java fornisce AtomicInteger e AtomicLong che può essere utilizzato senza alcuna sincronizzazione:

private final AtomicLong counter = new AtomicLong(); 

... 

counter.incrementAndGet(); // No need for synchronization 
+0

Come al solito, una risposta impressionante di Jon piattello. Jon hai scritto anche un libro sulla programmazione Java, in tal caso per favore fammi sapere :) Anche la raccomandazione di altri libri sarà apprezzata – JavaSa

+5

@JavaSa: No, non ho scritto nulla su Java. Raccomando caldamente Effective Java di Josh Bloch. –

+0

Grazie, hai anche un libro di suggerimenti gratuiti per coprire le nuove funzionalità che sono state nuove in Java dal 2005? Diciamo per java 7 e forse Java 8 – JavaSa

Problemi correlati