que tienen una necesidad de un contador del tipo long
con los siguientes requisitos/hechos:Long primitive o AtomicLong for a counter?
- incrementar el contador debe tomar tan poco tiempo como sea posible.
- El contador solo se escribirá con un hilo.
- La lectura del contador se realizará en otro hilo.
- El contador se incrementará regularmente (tanto como unos miles de veces por segundo), pero solo se leerá una vez cada cinco segundos.
- La precisión precisa no es esencial, solo una idea aproximada del tamaño del contador es suficiente.
- El contador nunca se borra, disminuye.
En función de estos requisitos, ¿cómo elegiría implementar su contador? ¿Como simple long
, como volatile long
o usando AtomicLong
? ¿Por qué?
Por el momento tengo un volatile long
pero me preguntaba si otro enfoque sería mejor. También estoy incrementando mi tiempo haciendo ++counter
en comparación con counter++
. ¿Es esto realmente más eficiente (como me han hecho creer en otro lado) porque no se está haciendo una tarea?
Gracias de antemano
Rich
volátil debe estar bien, ya que el contrato establece que cada lectura en una variable volátil se produce después de la liberación de bloqueo de una escritura anterior. – fasseg
Si solo lo actualizas unas mil veces por segundo y usas un procesador no incorporado, la diferencia es irrelevante; puede hacer millones de actualizaciones de 'AtomicLong' por segundo en la mayoría de las máquinas en estos días. Aún así, estoy de acuerdo en que 'volátil' debería ser suficiente. Podrías codificar los dos a la vez y comprobar con qué frecuencia coinciden (y cuándo no lo hacen) si querías estar seguro. –
@Riduidel estamos contando los paquetes de datos entrantes, y realmente no nos importa si el número es 12,345,678 o si es un poco tarde a 12,345,602 – Rich