java - 无法使用 java.nio.channels.FileLock 在 Linux 上锁定文件

标签 java linux filelock

我正在用 Java 创建一个应用程序,我只想为其运行一个实例。为此,我创建了一个文件并在应用程序运行时获得了锁。

我有以下代码,可以在 Windows 上运行,但在 Linux 上失败:一旦我获得了一个锁而不解锁它,我就可以在它上获得另一个锁。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class MyApp {

private static File f;
private static FileChannel channel;
private static FileLock lock;

public static void main(String[] args) {
    try {
        f = new File("RingOnRequest.lock");
        // Check if the lock exist
        if (f.exists()) {
            // if exist try to delete it
            f.delete();
        }
        // Try to get the lock
        channel = new RandomAccessFile(f, "rw").getChannel();
        lock = channel.tryLock();
        if(lock == null)
        {
            // File is lock by other application
            channel.close();
            throw new RuntimeException("Only 1 instance of MyApp can run.");
        }
        // Add shutdown hook to release lock when application shutdown
        ShutdownHook shutdownHook = new ShutdownHook();
        Runtime.getRuntime().addShutdownHook(shutdownHook);

        //Your application tasks here..
        System.out.println("Running");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    catch(IOException e)
    {
        throw new RuntimeException("Could not start process.", e);
    }

}

public static void unlockFile() {
    // release and delete file lock
    try {
        if(lock != null) {
            lock.release();
            channel.close();
            f.delete();
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
}

static class ShutdownHook extends Thread {

    public void run() {
        unlockFile();
    }
}

}

最佳答案

每次运行时都会删除锁定文件,因此只有一个进程可以对其进行锁定。

当您使用FileLock时,它纯粹是建议 - 获取文件上的锁可能不会阻止您执行任何操作......即使另一个进程已获取锁,读取、写入和删除文件也可能是可能的。有时,锁在特定平台上可能会做更多的事情,但这种行为是未指定的,并且依赖于类文档中所保证的更多内容会导致失败。

“咨询锁”只是一个对其他费心寻找它的进程可见的信号。如果您对它的依赖超过此限度,您的程序在其他平台上运行时就会崩溃。

为什么要删除锁定文件?锁定文件就像一个 boolean 标志,对系统上的每个进程都可见。设计您的协议(protocol)以这种方式使用它,您将拥有可靠的跨平台锁定机制。

关于java - 无法使用 java.nio.channels.FileLock 在 Linux 上锁定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32240123/

相关文章:

java - 使用按钮在嵌套回收器 View 中动态添加子项

linux - 在 Travis CI 中,如何使用 sudo 运行脚本来构建项目

java - 如果无论如何都会抛出 OverlappingFileLockException,那么在 FileChannel.lock 中等待的目的是什么?

linux - 如何在linux的init.rc中添加chmod u+s文件

linux - OpenOCD 无法连接到 cortex 处理器

java - JVM 在哪里持有我的文件锁?

java - 为什么递归调用下的代码被处理了不止一次(当基本情况为真时)?

java - 如何在pom.xml中声明jar文件?

java - 如何使用 java ArrayList 中的值更新表?