Java文件锁定

我有几个线程(其中一些由Process X生成,其他由Process Y生成, 等等 ),每个线程都需要写入一个文件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虚拟机。它们不适合控制同一虚拟机中多个线程对文件的访问。”

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

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

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

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