Java FileLock 文件并在退出时将其删除

Java FileLock on a file and delete it on exit

提问人:NightShade 提问时间:2/25/2021 更新时间:2/25/2021 访问量:353

问:

我有两个 JVM 进程在运行,比如 Process1Process2。每个进程都运行以下内容:

File lockFile = new File("lock");
if (!lockFile.exists()) {
    lockFile.createNewFile();
}

RandomAccessFile lockRAF = new RandomAccessFile(lockFile, "rw");

FileChannel channel = lockRAF.getChannel();
FileLock fileLock;
try {
    fileLock = channel.tryLock();
} catch (OverlappingFileLockException e) {
    ...
} ...

// do something exclusive

fileLock.release();
lockRAF.close();

lockFile.delete();

(不显示异常处理,因为它不是问题的重点)。

问题来自于删除末尾的文件,其中:

  • Process1 获取一个 FileLock,执行一些工作,然后释放它
  • 进程 2 获取锁
  • Process1 删除文件
  • 然后,Process1 尝试再次调用相同的代码片段。这是有效的,因为它创建了一个新文件,从中获取锁。
  • 结果是,这两个进程都获得了一个本应是排他性的锁。

注意:这发生在 Linux 上(Windows 不允许在锁定时删除文件)。

我怎样才能以一种允许在最后删除锁定文件的方式解决这个问题?File.deleteOnExist 不能解决问题。

Java Linux IO 锁定 NIO

评论

0赞 Panagiotis Bougioukos 2/25/2021
此答案对应于您的问题 stackoverflow.com/a/5715507/7237884
0赞 Panagiotis Bougioukos 2/25/2021
对于不同的 JVM,您使用的锁定方法是不安全的
1赞 VGR 2/25/2021
要将文件用作信号量,我根本不会使用 FileLock。相反,只需使用 Files.createFile。从文档中:“创建一个新的空文件,如果文件已经存在,则失败。检查文件是否存在以及创建新文件(如果不存在)是单个操作,对于可能影响目录的所有其他文件系统活动而言,该操作是原子的。

答: 暂无答案