синхронизированный счетчик в clojure - PullRequest
9 голосов
/ 18 сентября 2011

Если я хочу сохранить глобальный счетчик (например, для подсчета количества входящих запросов в нескольких потоках), то лучший способ сделать это в java - использовать volatile int.Предполагая, что используется clojure, есть ли лучший (лучшая пропускная способность) способ сделать это?

Ответы [ 2 ]

13 голосов
/ 18 сентября 2011

Я бы сделал это с атомом в Clojure:

(def counter (atom 0N))

;; increment the counter
(swap! counter inc)

;; read the counter
@counter
=> 1

Это полностью поточно-ориентированное и удивительно высокое быстродействие.Кроме того, поскольку он использует числовую обработку с прецизионной точностью Clojure, он не уязвим для целочисленных переполнений, так как volatile int может быть .....

7 голосов
/ 18 сентября 2011

Определить глобальный счетчик как agent

(def counter (agent 0))

Чтобы увеличить значение, содержащееся в агенте, вы send функция (в данном случае inc) для агента:

(send counter inc)

Для считывания текущего значения вы можете использовать deref или макрос считывателя @:

@counter ;; same as (deref counter)

Агенты - это только один из нескольких доступных типов ссылок. Вы можете прочитать больше об этих вещах на сайте Clojure:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...