Java中的进程间文件锁定

时间:2018-02-15 22:52:09

标签: java file locking mutex interprocess

我还没有找到任何特定的,只有线索 that,它没有显示实现。

我需要创建一个在两个或多个进程(而不是线程!)之间共享的文件锁。我需要在一个进程中读/写一个文件,并保证没有其他进程同时写入该文件。 FileChannel.lock()没有完成这项工作,因为每当锁存在时它都会抛出异常(OverlappingFileLockException)。

我有两个想法如何实现进程间互斥,但对我来说似乎都有点不好。

  1. 重复锁定动作直到它起作用 - 非常恶心,但很简单,它应该可以工作吗?

    RandomAccessFile rFile = new RandomAccessFile(file, "rw");
    FileChannel channel = rFile.getChannel();
    FileLock lock;
    boolean locked = false;
    while(!locked) {
        try {
            lock = channel.lock();
            locked = true;
        } catch(OverlappingFileLockException e) {
            Thread.sleep(10);
        }
    }
    lock.release();
    
  2. 每当抛出异常时,将当前进程转换为服务器。使用ServerSocket监听其他进程,并使用Socket通信已调用lock.release()。这个听起来像是用大炮杀死了一只苍蝇。

  3. 这两种方法中有任何一种正确处理我的问题吗?或者是否存在允许跨进程锁定文件的已有Java机制?

1 个答案:

答案 0 :(得分:0)

try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
    while (raf.getChannel().tryLock() == null) {
        Thread.sleep(10);
    }
    // lock acquired
}

锁定将被RandomAccessFile块自动释放(间接 - 通过关闭try-with-resurces)。 BTW OverlappingFileLockException被抛出,因为当前的JVM已经有锁,或者当前JVM的线程已经在等待它。