Java文件锁定

时间:2010-01-11 23:36:07

标签: java locking

我有几个线程(其中一些由Process X生成,其他由Process Y生成, et cetera ),每个线程都需要写入文件MyFile。但是,如果Thread T1首先开始写入MyFile,那么,当Thread T2开始编写时,需要等待T1 发布文件 ,以便它可以读取Thread T1中写入的内容。换句话说,每个线程都有一个finalizeThread方法,如下所示:

private void finalizeThread() {
    File f = new File("MyFile.dat");
    f.createNewFile();  // atomically creates the file, if it doesn't exist
    locked_section {
        readContentsFromFile(f); // read contents if some other thread already modified the file
        modifyContentsFromFile(f); // modify
        writeFile(f); // write, so that new threads can see the content modified by this thread
    }
}

我的问题是:如何完成上述代码中的locked_section?我正在研究FileLock类,但它在Javadoc中说“代表整个Java虚拟机保存文件锁。它们不适合控制多个线程对文件的访问相同的虚拟机。“

3 个答案:

答案 0 :(得分:12)

如果仅从您的程序访问该文件,则同步锁定对象是可以的。但是,如果您希望在处理文件时保护文件不被其他程序更改,则可以在java.nio.channels.FileLockexample)中使用Java的文件锁定功能。正如文中所说,请注意,在某些操作系统上,如果文件没有检查现有的文件锁,程序仍然可以更改文件。

答案 1 :(得分:2)

除了共享锁之外,您可能还有一个单独的进程负责维护对文件的锁定。要开始读取/修改/写入步骤,线程必须通过HTTP或消息传递或任何您喜欢的方式询问此中央进程的锁定。如果请求被拒绝,则线程将进入休眠状态,唤醒并再次尝试。否则,线程将读取/修改/写入,然后告诉锁定进程它正在释放锁定。

答案 2 :(得分:0)

您需要在某个对象上进行同步。例如:

synchronized(fileLockObject) {
    readContentsFromFile(f);
    modifyContentsFromFile(f);
    writeFile(f);
}