我使用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也讨论了文件锁的行为如何在不同的操作系统中变化。