Двойная проверка блокировки для инициализации состояния на диске - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь написать фрагмент кода, который позволяет мне установить библиотеку (то есть загрузить архив с удаленной конечной точки и распаковать его на диск) один раз для 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);    
    }
}

1 Ответ

0 голосов
/ 31 мая 2018

Проблема, с которой вы можете столкнуться, заключается в том, что вы потенциально можете заблокировать множество потоков на несколько минут, пока один поток находится внутри install ().Не уверен, что последствия этого будут в вашем приложении.Но кроме этого ваш код должен работать нормально, а состояние IS_INSTALLED должно быть хорошо видно всем потокам.

Вы должны даже иметь возможность использовать простой private static volatile boolean IS_INSTALLED

...