2012-06-18 6 views
4

내 프로젝트에서 많은 클라이언트가 서버의 맵을 수정합니다.기존 기능을 새 클래스에 적용하는 방법은 무엇입니까?

(def dict (ref {})) ; the map we play with 

을 그리고 dosync의 STM 방법을 사용하여이 맵을 업데이트 :이 같은 mapref 사용합니다.

user=> (time (dotimes [n 1000000] (dosync (alter xx assoc xx 1 1)))) 
"Elapsed time: 2470.766 msecs" 

그래서 내가 Clojure에 구축 된지도 및 STM의 자리를 차지할 기본 자바 CuncurrentHashMap을 사용하기로 결정 :하지만 내가 원하는대로되지 빨리 발견했다. Java CuncurrentHashMap을 Clojure로 랩핑하여 Clojure 맵 (assoc 포함)을 수정할 수 있도록하려면 어떻게해야합니까?, dissoc 등이 있습니다. 이렇게하면 코드 줄을 수정하지 않게됩니다.

이 방법이 있습니까?

답변

7

당신은 atom을 사용할 수 있습니다 당신은 단지 하나의 값을 수정하는 당신이 ref

user=> (def dict (atom {})) 
user=> (time (dotimes [n 1000000] (swap! dict assoc :xx 1))) 
"Elapsed time: 108.105703 msecs" 
에 대한 트랜잭션 따라서 필요가 없습니다 필요하지 않습니다
관련 문제