1 Обзор
Шаблон Singleton имеет несколько преимуществ:
(1) Определенные классы создаются чаще. Для некоторых крупных объектов это огромные системные затраты.
(2) Новый оператор опущен, что снижает частоту использования системной памяти и снижает нагрузку на GC.
(3) Некоторые классы, такие как основной торговый механизм биржи, контролируют процесс транзакции. Если можно создать несколько классов, система будет полностью перепутана.
2 Подробное объяснение
Существует два наиболее часто используемых способа написания шаблона Singleton.
2.1 Голодный китайский стиль
Если приложение всегда создает и использует шаблон Singleton или если нагрузка во время создания и выполнения не очень высока, вы можете использовать частную статическую переменную для предварительного создания объекта.
Скопируйте код кода следующим образом:
пакет org.scott.singleton;
/**
* @автор Скотт
* @версия 16.11.2013
* @описание
*/
общественный класс Singleton1 {
частный статический Singleton1 uniqueInstance = новый Singleton1();
частный синглтон1(){
}
общественный статический Singleton1 getInstance(){
вернуть уникальный экземпляр;
}
}
В этом случае, когда JVM загрузит этот класс, объект будет создан в соответствии с последовательностью инициализации. В то же время JVM может гарантировать, что любой поток должен сначала создать этот экземпляр и только один раз, прежде чем получить доступ к этому одноэлементному объекту.
Конечно, вы также можете использовать статический внутренний класс для выполнения той же функции.
Скопируйте код кода следующим образом:
пакет org.scott.singleton;
/**
* @автор Скотт
* @версия 16.11.2013
* @описание
*/
общественный класс Singleton2 {
частный синглтон2() {
}
/**
* Здесь используется внутренний класс для поддержки синглтона.
* */
частный статический класс SingletonFactory {
частный статический экземпляр Singleton2 = новый Singleton2();
}
общественный статический Singleton2 getInstance() {
вернуть SingletonFactory.instance;
}
/**
* Если объект используется для сериализации, можно гарантировать, что объект останется согласованным до и после сериализации.
* */
публичный объект readResolve() {
вернуть getInstance();
}
}
2.2 Метод двойной блокировки
«Двойная блокировка», как следует из названия, представляет собой две блокировки. Первая блокировка используется для проверки того, создан ли создаваемый объект-экземпляр. Если он не был создан, для синхронизации используется вторая блокировка.
Скопируйте код кода следующим образом:
пакет org.scott.singleton;
/**
* @автор Скотт
* @версия 16.11.2013
* @описание
*/
общественный класс Singleton3 {
частный изменчивый статический Singleton3 uniqueInstance;
частный синглтон3(){
}
публичный статический Singleton3 getInstance(){
если (uniqueInstance == ноль) {
синхронизировано (Singleton3.class) {
если (uniqueInstance == ноль) {
uniqueInstance = новый Singleton3 ();
}
}
}
вернуть уникальный экземпляр;
}
}
Если требования к производительности относительно высоки, этот метод может значительно сократить время создания. В настоящее время этот метод также является относительно распространенным способом создания синглтонов.