2011-12-15 9 views
17

Cosa succede se AtomicInteger raggiunge Integer.MAX_VALUE e viene incrementato?Incremento di AtomicInteger

Il valore torna a zero?

+16

È possibile provare facilmente questo impostando un numero intero sul valore massimo e quindi incrementandolo. – Gabe

+5

null non è un numero nativo –

+7

+1 per questa domanda! Penso che il punto di overflow dello Stack sia per noi rispondere a domande come questa e non far sentire male qualcuno per aver fatto la domanda. Il punto non è se un utente debba essere in grado di "capirlo" o meno. Hanno legittimamente bisogno di aiuto e noi siamo qui per fornirlo. –

risposta

32

Guardate voi stessi:

System.out.println(new AtomicInteger(Integer.MAX_VALUE).incrementAndGet()); 
System.out.println(Integer.MIN_VALUE); 

uscita:

-2147483648 
-2147483648 

sembra che fa involucro a MIN_VALUE.

6

browing il codice sorgente, hanno appena un

private volatile int value; 

e, e vari luoghi, aggiungere o sottrarre da esso, ad esempio in

public final int incrementAndGet() { 
    for (;;) { 
     int current = get(); 
     int next = current + 1; 
     if (compareAndSet(current, next)) 
     return next; 
    } 
} 

Così dovrebbe seguire la matematica Java intero standard ed avvolgere intorno al Integer.MIN_VALUE. I JavaDocs per AtomicInteger sono silenziosi sull'argomento (da quello che ho visto), quindi suppongo che questo comportamento potrebbe cambiare in futuro, ma ciò sembra estremamente improbabile.

C'è un AtomicLong se questo sarebbe di aiuto.

vedi anche What happens when you increment an integer beyond its max value?