Рассмотрим следующий код, реализующий двойную проверку блокировки, используя synchronized
ключевое слово в JAVA 8:Преобразовать двойную проверку блокировки с использованием синхронизирована замков в JAVA
private static void redoHeavyInitialisation() {
if (needToReinitialise()) {
synchronized (MyClass.class) {
if (needToReinitialise()) {
doHeavyInitialisation();
}
}
}
}
Двойная проверка блокировки причина используется, происходит потому, что инициализация является тяжелым (отсюда и ленивый) И это может случиться более одного раза (поэтому одноэлементный шаблон нельзя использовать, исправьте меня, если я ошибаюсь).
Как бы то ни было, во-первых, как вы преобразовываете код выше, чтобы использовать Lock
из параллельного пакета JAVA вместо использования синхронизированного ключевого слова?
Только после этого И необязательно прокомментируйте использование блокировки или синхронизированного ключевого слова, которое лучше.
Помните, что этот вопрос не касается синхронизации с синхронизированным сравнением. Ответные попытки, не отвечая на часть преобразования кода, не будут выбраны в качестве принятого ответа.
Возможный дубликат [Синхронизация против Lock] (http://stackoverflow.com/questions/4201713/synchronization-vs-lock) –
@ErwinBolwidt Да, если вы сосредоточены только на сравнении и полностью игнорируете этот вопрос, требуя эквивалентного преобразования кода, что является основным вопросом. Вам не нужно комментировать сравнение, если вы не хотите этого, но ответьте на конвертацию кода, пожалуйста. – user1589188
Вы можете использовать singleton. Одной возможной архитектурой будет создание класса Singleton HeavyInitializer с синхронизированными методами для инициализации и повторной инициализации. – Chocksmith