Ho una necessità di un contatore di tipo long
con i seguenti requisiti/fatti:Long primitive o AtomicLong per un contatore?
- incrementare il contatore dovrebbe prendere il minor tempo possibile.
- Il contatore verrà scritto solo da un thread.
- La lettura dal contatore verrà eseguita in un altro thread.
- Il contatore verrà incrementato regolarmente (fino a qualche migliaio di volte al secondo), ma verrà letto solo una volta ogni cinque secondi.
- Precisione di precisione non è essenziale, solo un'idea approssimativa delle dimensioni del contatore è abbastanza buona.
- Il contatore non viene mai cancellato, decrementato.
Sulla base di questi requisiti, come sceglieresti di implementare il tuo contatore? Come semplice long
, come volatile long
o con un AtomicLong
? Perché?
Al momento ho un volatile long
ma mi chiedevo se un altro approccio sarebbe stato meglio. Sto anche incrementando il mio lungo facendo ++counter
in contrasto con counter++
. E 'davvero più efficiente (come sono stato portato a credere altrove) perché non è stato fatto nessun incarico?
Grazie in anticipo
Rich
volatile dovrebbe andare bene, poiché il contratto stabilisce che ogni lettura su una variabile volatile viene dopo il rilascio del blocco di una scrittura precedente. – fasseg
Se lo aggiorni solo poche migliaia di volte al secondo e usi un processore non incorporato, la differenza è irrilevante; puoi fare milioni di aggiornamenti "AtomicLong' al secondo su quasi tutte le macchine in questi giorni. Tuttavia, sono d'accordo che "volatile" dovrebbe essere sufficiente. Potresti codificarli entrambi contemporaneamente e controllare quanto spesso corrispondono (e quando non sono lontani) se vuoi essere sicuro. –
@Riduidel contiamo i pacchetti in entrata di dati, e non ci importa se il numero è 12,345,678 o se è leggermente in ritardo a 12,345,602 – Rich