Некоторое время назад я написал небольшую статью, объясняющую шаблон проектирования Singleton . В котором я объяснил два способа создания шаблона Singleton. Ленивая инициализация и инициализация во время выполнения .
Шаблон проектирования Singleton решает все вышеперечисленные проблемы. С помощью шаблона проектирования Singleton вы можете:
- Убедитесь, что создан только один экземпляр класса
- Предоставить глобальную точку доступа к объекту
- Разрешить несколько экземпляров в будущем, не затрагивая клиентов одноэлементного класса
В этом простом примере показано, как создать отложенное создание экземпляра Singleton ThreadSafe без использования синхронизированного ключевого слова. Еще одна очень интересная статья, которую вы, возможно, захотите посмотреть, — Синхронизированный быстрый кэш .
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
пакет ком . ebay ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс одиночка {
частный Синглтон ( ) {
}
частный статический учебный класс HoldInstance {
частный статический окончательный Синглтон ИНСТАНС знак равно новый Синглтон ( ) ;
}
общественности статический Синглтон getInstance ( ) {
вернуть HoldInstance . INSTANCE ;
}
}
|
Реализация опирается на четко определенную фазу инициализации выполнения в виртуальной машине Java (JVM).
Другой должен прочитать: Java: Пример использования для производителя — Обработка одновременного чтения / записи
Когда класс Singleton загружается JVM , класс проходит инициализацию. Поскольку у класса нет статических переменных для инициализации, инициализация завершается тривиально. Определение статического класса HoldInstance внутри него не инициализируется, пока JVM не определит, что HoldInstance должен быть выполнен. Статический класс HoldInstance выполняется только тогда, когда статический метод getInstance вызывается в классе Singleton и в первый раз, когда это произойдет, JVM загрузит и инициализирует HoldInstance учебный класс. Инициализация HoldInstance класс приводит к статической переменной INSTANCE инициализируется путем выполнения (частного) конструктора для внешнего класса Singleton , Поскольку фаза инициализации класса гарантируется JLS последовательным, то есть не параллельным, никакой дополнительной синхронизации в статическом не требуется getInstance метод во время загрузки и инициализации. А так как фаза инициализации записывает статическую переменную INSTANCE в последовательной операции все последующие одновременные вызовы getInstance вернет то же правильно инициализированный INSTANCE без дополнительных затрат на синхронизацию.
Используйте этот шаблон, если инициализация класса стоит дорого, и это не может быть безопасно сделано во время загрузки класса, и инициализация является параллельной . Суть шаблона — безопасное удаление накладных расходов на синхронизацию, связанных с доступом к одноэлементному экземпляру.
0.00 (0%) 0 votes








