Java中可用的锁文件

时间:2014-11-14 15:57:18

标签: java file locking file-locking

关于SO的其他问题与此非常相似,但没有一个能完全解决我的问题:

我有一个Java程序,我想按计划运行,我不希望一次运行多个副本。所以,我正在使用javax.nio.channels.FileLock这样(简化):

File fileToLock = new File("lockfile");
RandomAccessFile raf = new RandomAccessFile(fileToLock, "rw");
FileLock lock = raf.getChannel().lock();

// File is locked, do my work

lock.release();
raf.close();

这很好用,除了锁定文件在终止后粘在一起。如果我在程序结束时添加删除:

fileToLock.delete();

在程序终止之前删除文件。大。

除了在同时运行程序的两个副本时,它们都将锁文件作为随机访问文件打开,这意味着它们都指向同一目录条目,并且当持有锁的进程删除时该文件并释放锁,然后第二个进程有一个已锁定的文件,锁定它。

这意味着该程序的另一个实例可以启动,因为请求一个名为“lockfile”的RandomAccessFile将创建一个 new 文件并将其锁定,即使旧的lockfile仍然存在被另一个进程“锁定”。以下是对事件顺序的快速描述:

  1. 进程A启动,创建lockfile(inode 123)并锁定它
  2. 处理B语言,打开“lockfile”,请求锁定,并阻止等待锁定
  3. 进程A完成,删除inode 123,并释放锁定
  4. 进程B获取inode 123的锁定(仍然有效,因为inode 123具有实时进程拥有的文件描述符)并继续
  5. 进程C启动,创建lockfile(inode 124)并锁定它
  6. 此时,我有两个进程同时运行,这是我想要避免的。

    我也试过File.renameTo但当然也有同样的问题:文件名一旦被打开就无关紧要了,因为FileChannel指的是文件描述符,而不是“在文件系统上命名。

    我唯一的选择似乎是将锁文件留在原位,即使它没有被主动用作锁文件。这个问题还有其他解决方案吗?

0 个答案:

没有答案