Как насчет использования агентов вместо блокировок для обеспечения этого?
Я думаю, что использование агентов для защиты общего изменяемого состояния, независимо от того, находится ли оно в памяти или на диске, более идиоматично по сравнению с использованием блокировок.
Если вы создаете по одному агенту за раз и отправляете попытки доступа агентам, вы можете гарантировать, что только в потоке одновременно будет доступ к данному файлу.
Например, вот так:
(use 'clojure.contrib.duck-streams)
(defn file-agent [file-name]
(add-watch (agent nil) :file-writer
(fn [key agent old new]
(append-spit file-name new))))
(defn async-append [file-agent content]
(send file-agent (constantly content)))
затем добавьте ваш файл через агента:
(async-append "content written to file" (file-agent "temp-file-name"))
Если вам нужно синхронное использование файла, это может быть достигнуто с помощью await. Как это:
(defn sync-append [file-agent content]
(await (send file-agent (constantly content))))