我有几个线程(其中一些由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虚拟机保存文件锁。它们不适合控制多个线程对文件的访问相同的虚拟机。“。
答案 0 :(得分:12)
如果仅从您的程序访问该文件,则同步锁定对象是可以的。但是,如果您希望在处理文件时保护文件不被其他程序更改,则可以在java.nio.channels.FileLock
(example)中使用Java的文件锁定功能。正如文中所说,请注意,在某些操作系统上,如果文件没有检查现有的文件锁,程序仍然可以更改文件。
答案 1 :(得分:2)
除了共享锁之外,您可能还有一个单独的进程负责维护对文件的锁定。要开始读取/修改/写入步骤,线程必须通过HTTP或消息传递或任何您喜欢的方式询问此中央进程的锁定。如果请求被拒绝,则线程将进入休眠状态,唤醒并再次尝试。否则,线程将读取/修改/写入,然后告诉锁定进程它正在释放锁定。
答案 2 :(得分:0)
您需要在某个对象上进行同步。例如:
synchronized(fileLockObject) {
readContentsFromFile(f);
modifyContentsFromFile(f);
writeFile(f);
}