У меня есть несколько потоков (некоторые из которых порождаются процессом X, другие - процессом Y, и так далее), и каждый поток необходимо записать в файл MyFile
. Однако, если Thread T1
начинает писать в MyFile
первый, а затем, когда Thread T2
начинает писать, он должен ждать T1
к релиза файла, так что он может прочитать содержимое, написанные в Thread T1
. Другими словами, каждый поток будет иметь метод finalizeThread
, например, так:Блокировка файлов Java
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. Они не подходят для управления доступом к файлу несколькими потоками на той же виртуальной машине»..
Вы уверены, что действительно хотите использовать метод finalize()? – Dmitry
Нет, имя метода фактически не завершено. Это метод/обратный вызов, который вызывается после потока (на самом деле, набор потоков, но это не имеет значения для случая) завершается его работой, поскольку я не использую стандартные потоки API Java Concurrency. Я собираюсь переименовать его, чтобы избежать путаницы с 'Object # finalize'. –