我试图锁定一个文件,并写入它与下面的代码:锁定一个文件时,为什么会发生OverlappingFileLockException?
public class TrainSetBuildTask implements Runnable {
private String pathname;
public TrainSetBuildTask(String pathname){
this.pathname = pathname;
}
@Override
public void run() {
try {
String content = "content\n";
//write to a file
FileOutputStream os = new FileOutputStream(new File(pathname), true);
FileChannel channel = os.getChannel();
FileLock lock = channel.tryLock();
if (lock != null) {
ByteBuffer bytes = ByteBuffer.wrap(content.getBytes());
channel.write(bytes);
lock.release();
}
channel.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
而且新的双线程与类的实例:
String pathname = "/home/sjtu123/test.arff";
TrainSetBuildTask task1 = new TrainSetBuildTask(pathname);
Thread t1 = new Thread(task1);
TrainSetBuildTask task2 = new TrainSetBuildTask(pathname);
Thread t2 = new Thread(task2);
t1.start();
t2.start();
然后我得到的错误OverlappingFileLockException。我不知道为什么会发生这种情况,因为我只是在每个线程中锁定文件一次?如何修复我的代码?
那么'FileLock'的用法是什么,因为它不能用于协调想要写入文件的线程? @Atila – 2012-03-28 11:30:52
这是为了防止其他人(例如其他程序)与持有该锁的人同时访问该文件。该异常指示别人(在这种情况下你自己的一个线程)已经在文件上的锁。如果你不想放弃(从你的程序的角度来看),你可以稍后尝试,例如,希望到那时锁定被释放。 – Attila 2012-03-28 11:34:47
我在上面写这些代码之前已经阅读了手册,并且不理解它们的含义。现在我明白了,谢谢。 @Attila – 2012-03-28 11:44:08