Clojure中的文件锁定



我使用JavaFileLock来锁定Clojure中的文件(在macOS上)。这是我获取锁的代码:

(defn lock-file
[file-path]
(try
(let [file (io/file file-path)
channel (.getChannel (RandomAccessFile. file "rw"))]
(if-let [lock (.tryLock channel)]
channel
(do
(println (format "Lock on %s couldn't be acquired" file-path))
(System/exit 1))))
(catch OverlappingFileLockException _
(println (format "Lock on %s couldn't be acquired" file-path))
(System/exit 1))))

这在两个进程都使用lock-file时有效。

但是一个进程可以使用spit写文件,即使文件被其他进程锁定。FileLock不能防止这种情况吗?

我不明白FileLock有什么用,如果它不能防止这种情况。

我想要一个文件的读写锁。任何其他进程都不能读/写被锁定的文件。是否有一种习惯的Clojure方法来做到这一点?

如果你想协调进程之间的事情,你当然需要操作系统的帮助:如果不涉及操作系统,你就无法影响另一个进程。因此,要弄清楚要在哪个操作系统上运行它,并查看它是如何管理文件锁的。例如,在Linux上,所有的文件锁都是建议的。你可以说,"嘿,我正在使用这个文件,你可能不应该"。但是如果另一个进程忽略了这个建议,它仍然可以使用这个文件。有关这方面的进一步讨论,请参见获取原子更新文件上的独占读/写锁。同样,FileLock的Javadoc也讨论了文件锁的行为如何在不同的操作系统中变化。

最新更新