J'ai besoin d'un compteur de type long
avec les exigences/faits suivants:Long primitif ou AtomicLong pour un compteur?
- incrémenter le compteur devrait prendre aussi peu de temps que possible.
- Le compteur ne sera écrit que par un thread.
- La lecture à partir du compteur se fera dans un autre thread.
- Le compteur sera incrémenté régulièrement (jusqu'à quelques milliers de fois par seconde), mais ne sera lu qu'une fois toutes les cinq secondes.
- Une précision précise n'est pas essentielle, seule une idée approximative de la taille du compteur est suffisante.
- Le compteur n'est jamais effacé, décrémenté.
En fonction de ces exigences, comment choisiriez-vous d'implémenter votre compteur? En tant que simple long
, en tant que volatile long
ou en utilisant un AtomicLong
? Pourquoi?
En ce moment j'ai un volatile long
mais je me demandais si une autre approche serait meilleure. J'augmente aussi mon long en faisant ++counter
par opposition à counter++
. Est-ce vraiment plus efficace (comme on me l'a laissé croire ailleurs) parce qu'il n'y a pas de mission en cours?
Merci à l'avance
Rich
volatile devrait être bon, car le contrat stipule que chaque lecture sur une variable volatile vient après la libération de verrouillage d'une écriture précédente. – fasseg
Si vous ne le mettez à jour que quelques milliers de fois par seconde et que vous utilisez un processeur non intégré, la différence n'est pas importante; vous pouvez faire des millions de mises à jour de 'AtomicLong' par seconde sur la plupart des machines de nos jours. Pourtant, je suis d'accord que «volatile» devrait être suffisant. Vous pouvez encoder les deux à la fois et vérifier à quelle fréquence ils correspondent (et quand ils ne le font pas à quelle distance ils sont) si vous voulez être sûr. –
@Riduidel nous comptons les paquets entrants de données, et je ne nous soucions pas vraiment si le nombre est 12,345,678 ou s'il est légèrement en retard à 12,345,602 – Rich