Я пытаюсь написать фрагмент кода, который позволяет мне установить библиотеку (то есть загрузить архив с удаленной конечной точки и распаковать его на диск) один раз для JVM (может иметь несколько JVM на машину, но это не главное)вопроса).
Мне известны недостатки техники DCL в отношении синхронизации памяти, но я не уверен, что меня это должно волновать в моем случае, так как мойсостояние на диске.
Можете ли вы найти какое-либо состояние гонки в следующем фрагменте?Я не смог найти никакой информации о безопасности потоков операций с файловой системой в документации стандартной библиотеки (ну, некоторые методы явно гарантированно являются атомарными, но об остальных ничего не сказано).
public class LibraryInstaller {
// singleton state
private static AtomicBoolean IS_INSTALLED = new AtomicBoolean();
// this method will be called hundreds of millions of times. I could remove this requirement but it would force me
// to use a dirty hack (the justification for that is out of scope)
public static void ensureInstalled() {
// double-checked locking to allow faster access after the initial installation
if (IS_INSTALLED.get()) return;
synchronized (LibraryInstaller.class) {
if (!IS_INSTALLED.get()) install();
}
}
// takes several minutes
private static void install() {
downloadLibraryAndUncompressOnDisk();
IS_INSTALLED.set(true);
}
}