Si quiero mantener un contador global (por ejemplo, para contar el número de solicitudes entrantes a través de varios hilos), entonces la mejor manera de hacerlo en Java sería usar un int volátil. Suponiendo que se use clojure, ¿hay una forma mejor (mejor rendimiento) de hacer?contador sincronizado en clojure
9
A
Respuesta
13
Me gustaría hacer esto con una atom en Clojure:
(def counter (atom 0N))
;; increment the counter
(swap! counter inc)
;; read the counter
@counter
=> 1
Esto es totalmente seguro para subprocesos, y sorprendentemente alto rendimiento. También, ya que utiliza la manipulación numérica abitrary precisión de Clojure, no es vulnerable a desbordamientos de enteros en la forma en que un int volátil puede ser .....
7
definir un contador global como agent
(def counter (agent 0))
para aumentar el valor contenido en el agente que send
una función (en este caso inc
) al agente:
(send counter inc)
para leer el valor actual puede utilizar deref
o laMacro del lector:
@counter ;; same as (deref counter)
Los agentes son solo uno de varios tipos de referencia disponibles. Puede leer más acerca de estas cosas en el sitio web de Clojure:
Cuestiones relacionadas
- 1. Crear un contador que permanezca sincronizado a través de procesos MPI
- 2. java sincronizado en el método ¿No funciona?
- 3. contador estático en C++
- 4. Contador atómico en gcc
- 5. objeto sincronizado configurado en nulo
- 6. Cuándo usar sincronizado en Java
- 7. ¿Qué significa "sincronizado" en Java?
- 8. Si un método sincronizado llama a otro método no sincronizado, ¿hay un bloqueo en el método no sincronizado
- 9. ReentrantReadWriteLock vs sincronizado
- 10. Bloque sincronizado - Java
- 11. Diálogo no modal sincronizado
- 12. Desplazamiento sincronizado Componentes Delphi
- 13. Contador de visitas en magento
- 14. Bloque variable y sincronizado final en java
- 15. ¿Cómo funciona el trabajo sincronizado en Java
- 16. interbloqueo en sincronizado (Interno de cadena())
- 17. Código inesperado en el bloque sincronizado
- 18. ¿Qué hace sincronizado en un método estático?
- 19. Ejecución del procedimiento almacenado sincronizado en mysql
- 20. Sincronizado vs ReentrantLock en el rendimiento
- 21. ¿Cuál es la diferencia entre un método sincronizado y un bloque sincronizado en Java?
- 22. Jquery cada uno() Contador
- 23. Contador de incremento Talend
- 24. bucle foreach con contador
- 25. ¿Contador de programa?
- 26. Contador de JPA NamedQuery
- 27. Contador de caché en una relación habtm?
- 28. Incremento atómico de un contador en django
- 29. Contador automático en Ruby para cada uno?
- 30. contador de rendimiento personalizado en C#/perfmon
habría que proporcionar un mejor rendimiento y luego usando un int volátil? en caso afirmativo, cualquier idea sobre por qué/cómo es mejor. – 142857
Un átomo sería un poco más lento que un int volátil. Pero a menos que esté contando millones de eventos por segundo, la diferencia no sería lo suficientemente grande como para darse cuenta. Y a ese nivel de rendimiento, una int volátil se desbordará en menos de una hora de todos modos ...... – mikera
En Clojure 1.3, puede desbordarse: '(swap! (Átomo 9223372036854775807) inc)' arroja una excepción de desbordamiento. La solución es usar BigInts: '(swap! (Átomo 9223372036854775807N) inc)' o la función 'inc'' de promoción automática –