처음 Monger에서 데이터베이스 참조를 가져 오는 get-database
함수를 구현하려고합니다. 원자에서 값을 기억하고 후속 호출에서 직접 반환합니다. 나의 현재 코드는 다음과 같습니다compare-and-set을 사용한 지연 평가
(def database (atom nil))
(defn get-database
[]
(compare-and-set! database nil
(let [db (:db (mg/connect-via-uri (System/getenv "MONGOLAB_URI")))] db))
@database)
문제는 let
절은 거짓 경우에도 compare-and-set!
수익률을 평가하는 것 같다 (즉 database
이 nil
하지 않습니다). 느슨하게 평가할 수있는 방법이있어 Monger 연결을 검색하는 페널티가 발생하지 않거나 근본적으로 잘못된 방법일까요?
니스. 그래서 나는이 경우에'database'를 원자로 만드는 것은 무리가 있다고 생각합니다. 지연을 사용하면 경쟁 조건이 발생하지 않을 것이라고 보장합니까? –
수정. 지연 구현은 스레드로부터 안전하며 본문이 한 번만 실행되도록합니다. 본문이 실행되는 동안 다른 스레드에서 지연을 역 참조하려고하면 완료 될 때까지 차단됩니다. – Alex
이 질문은 별개의 질문 일지 모르지만 지연 동시 업데이트에 대해서는 아직 명확하지 않습니다. 역 참조가 된 후 지연 값을 변경하는 것이 좋을까요? 그렇다면 왜 원자는'swap! '(또는 다른 함수)을 사용하여 업데이트되어야하지만 딜레이에는 동등한 함수가 없다. –