Se voglio mantenere un contatore globale (ad esempio per contare il numero di richieste in entrata su più thread), il modo migliore per fare in java sarebbe utilizzare un int volatile. Supponendo che venga usato il clojure, c'è un modo migliore (migliore rendimento) di fare?contatore sincronizzato in clojure
9
A
risposta
13
farei questo con un atom in Clojure:
(def counter (atom 0N))
;; increment the counter
(swap! counter inc)
;; read the counter
@counter
=> 1
Questo è totalmente thread-safe, e sorprendentemente elevate prestazioni. Inoltre, dato che utilizza abitrary precisione manipolazione numerica di Clojure, non è vulnerabile a integer overflow in modo che un int volatile può essere .....
7
Definire un contatore globale come agent
(def counter (agent 0))
per aumentare il valore contenuto nel agente che si send
una funzione (in questo caso inc
) all'agente:
(send counter inc)
per leggere il valore corrente è possibile utilizzare deref
o @
lettore macro:
@counter ;; same as (deref counter)
Gli agenti sono solo uno dei diversi tipi di riferimento disponibili. Si può leggere di più su queste cose sul sito Clojure:
Problemi correlati
- 1. "sincronizzato (questo)" contro "sincronizzato ((BaseClass) questo" in Java?
- 2. Creazione di un contatore che rimane sincronizzato tra i processi MPI
- 3. è sincronizzato il metodo Collection toArray() sincronizzato?
- 4. contatore statico in C++
- 5. Aggiornamento contatore in XQuery
- 6. Contatore atomico in gcc
- 7. È sincronizzato ereditato in Java?
- 8. @sincronizzato in un metodo statico
- 9. Quando utilizzare sincronizzato in Java
- 10. Cosa significa "sincronizzato" in Java?
- 11. Clojure Editor scritto in Clojure
- 12. selezionare contatore incremento in mysql
- 13. Contatore di colpi in magento
- 14. sincronizzato Vs Semaforo
- 15. AVPlayer non sincronizzato
- 16. Blocco sincronizzato - Java
- 17. OnSensorChanged sincronizzato Android?
- 18. nidificati sincronizzato parola chiave
- 19. Elenco Sincronizzato Java
- 20. blocco sincronizzato annidati
- 21. Ordine di rilascio sincronizzato
- 22. chiama Thread.sleep() dal contesto sincronizzato in Java
- 23. Qual è la differenza tra un metodo sincronizzato e un blocco sincronizzato in Java?
- 24. Contatore incrementale Talend
- 25. Variabile contatore per classe
- 26. ciclo foreach con contatore
- 27. Consistenza contatore orologio multicore
- 28. Jquery ciascuno() Contatore
- 29. contatore per manubri #each
- 30. Contatore lista python 2.7
sarebbe meglio fornire un throughput quindi utilizzando un int volatili? se sì, qualsiasi intuizione sul perché/come è meglio. – 142857
Un atomo sarebbe un po 'più lento di un int volatile. Ma a meno che non contiate milioni di eventi al secondo, la differenza non sarebbe abbastanza grande da notare. E a quel livello di throughput, un int volatile traboccherebbe in meno di un'ora ...... – mikera
Su Clojure 1.3, può overflow: '(scambia (atom 9223372036854775807) inc)' lancia un'eccezione di overflow. La correzione consiste nell'utilizzare BigInts: '(swap! (Atom 9223372036854775807N) inc)' o la funzione di promozione automatica 'inc'' –