Warum OverlappingFileLockException passieren, wenn beim sperren eine Datei?
Ich versuche, eine Datei sperren und schreiben Sie es mit den folgenden code:
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();
}
}
}
Und neuen zwei thread mit Instanzen der Klasse:
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();
Dann bekomme ich die Fehlermeldung OverlappingFileLockException. Ich Frage mich, warum dies geschieht, da ich nur die Datei sperren, wenn in jedem thread? Wie kann fix meinen code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie nicht sperren kann die gleiche Datei mehr als einmal gleichzeitig. Entweder Sie verwenden müssen, um java-Objekte gesperrt werden, um sicherzustellen, dass nur ein thread versucht, die Datei sperren, zu einer Zeit, oder sonst zu koordinieren, die threads warten, bis kein anderer thread sperren.
Aus der Handbuch:
FileLock
da kann es nicht verwendet werden, um die Koordinierung der threads was schreiben möchte-Datei? @AttilaDateien gesperrt sind weltweit nicht nur pro thread oder pro Prozess.
Müssen Sie zum ausführen von zwei Threads nacheinander, wie diese:
Neue version nach Kommentare:
und