English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом примере мы делимся конкретным кодом паттерна Singleton из Java Design Patterns, чтобы вы могли использовать его в качестве примера, подробности см. ниже
Концепция:
Паттерн Singleton: класс имеет только один экземпляр.
Класс имеет только один экземпляр и предоставляет глобальный доступ.
Когда мы просматриваем веб-сайты, некоторые из них показывают
Таким же образом, в других ситуациях также могут встретиться подобные ситуации, использующие аналогичные идеи. Например:
Внешние ресурсы: у каждого компьютера есть несколько принтеров, но только один PrinterSpooler, чтобы избежать одновременного вывода двух задач на печать. Внутренние ресурсы: большинство программ имеют один или несколько файлов свойств для хранения конфигурации системы, и такие системы должны иметь объект для управления этими файлами свойств.
Task Manager (диспетчер задач) Windows также является очень типичным шаблоном единственного экземпляра (вам это знакомо, правда?). Подумайте, можете ли вы открыть два окна Task Manager? Не верите? Попробуйте сами~
Recycle Bin (контейнер для удаленных файлов) Windows также является примером типичного использования единственного экземпляра. В整个过程 работы системы контейнер для удаленных файлов поддерживает только один экземпляр.
Обычно реализация счетчика веб-сайта также использует шаблон единственного экземпляра, так как это сложно синхронизировать.
Обычно реализация логирования приложения также использует шаблон единственного экземпляра, так как.shared логовые файлы всегда открыты, так как может быть только один экземпляр для управления, иначе содержимое трудно добавить.
Чтение объектов конфигурации веб-приложения обычно также использует шаблон единственного экземпляра, так как конфигурационные файлы являются общими ресурсами.
Обычно дизайн пула подключений базы данных также использует шаблон единственного экземпляра, так как подключение к базе данных является ресурсом базы данных. В системе программного обеспечения базы данных использование пула подключений к базе данных в основном направлено на экономию эффективности, связанной с открытием или закрытием подключения к базе данных, которая очень дорога, так как использование шаблона единственного экземпляра для поддержания может значительно снизить такие потери.
Обычно дизайн пула потоков многопоточности также использует шаблон единственного экземпляра, так как пул потоков должен легко контролировать потоки в пуле.
Файловая система операционной системы также является конкретным примером реализации шаблона единственного экземпляра, так как в одной операционной системе может быть только одна файловая система.
HttpApplication также является примером типичного использования единственного экземпляра. Те, кто熟悉ASP.Net(IIS) и весь процесс обработки запросов, должны знать, что HttpApplication также использует шаблон единственного экземпляра, и все HttpModule делят один экземпляр HttpApplication.
In summary, the general application scenarios of the singleton pattern are:
1. Objects that need to be instantiated frequently and then destroyed.
2. Objects that take too much time or resources to create but are used frequently.
3. Tool class objects with state.
4. Objects frequently accessing the database or files.
5. In the case of resource sharing, it avoids performance or loss caused by resource operations. For example, the log file, application configuration, etc.
6. In the control of resources, it is convenient for the communication between resources. For example, thread pool.
Characteristics:
1. The singleton class can only have one instance;
2. The singleton class must create its own unique instance;
3. The singleton class must provide this instance to all other objects
Singleton pattern elements:
1. Private constructor
2. Private static reference points to its own instance
3. Public static method that returns its own instance
Implementing three methods to achieve the singleton pattern:
1. 饿汉式:单例实例在类加载时就构建,急切初始化。(预先加载法)
/** * 饿汉式(推荐) * */ public class Test { private Test() { } public static Test instance = new Test(); public Test getInstance() { return instance; } }
Преимущества
1. Thread safety
2. A static object is created at the same time as the class is loaded, and the response speed is fast when called
Недостатки
Resource efficiency is not high, and getInstance() may never be executed, but if other static methods of the class are executed or the class is loaded (class.forName), then the instance is still initialized
2. Lazy initialization: The singleton instance is constructed when it is first used, and the initialization is delayed.
class Test { private Test() { } public static Test instance = null; public static Test getInstance() { if (instance == null) { //When multiple threads judge that instance is null, a duplicate operation will occur when executing new operation instance = new Singleton2(); } return instance; } }
Преимущества
It avoids the creation of an instance in the饿汉式 without using it, which has high resource utilization. If getInstance() is not executed, the instance will not be created, and other static methods of the class can be executed.
Недостатки
Lazy initialization works well in a single thread, but when multiple threads access it at the same time, it may create multiple instances at the same time, and these multiple instances are not the same object. Although the later created instances will overwrite the earlier created instances, there will still be a situation where different objects are obtained. The solution to this problem is to add locking with synchronized, which is not fast enough during the first load, and the unnecessary synchronization overhead in multi-threading is large.
3. Двойная проверка
class Test { private Test() { } public static Test instance = null; public static Test getInstance() { if (instance == null) { synchronized (Test.class) { if (instance == null) { instance = new Test(); } } } return instance; } }
Преимущества
Высокая эффективность использования ресурсов, не выполняется getInstance(), не создается экземпляр, можно выполнять другие статические методы этого класса
Недостатки
При первом загрузке的反应不够快, из-за некоторых причин модели памяти Java иногда терпит неудачу
4. Статический внутренний класс
class Test { private Test() { } private static class SingletonHelp { static Test instance = new Test(); } public static Test getInstance() { return SingletonHelp.instance; } }
Преимущества
Высокая эффективность использования ресурсов, не выполняется getInstance(), не создается экземпляр, можно выполнять другие статические методы этого класса
Недостатки
При первом загрузке的反应不够快
Резюме:
Обычно используется способ голодного хищника, если очень在意资源, можно использовать статический внутренний класс, не рекомендуется использовать способ ленивого хищника и двойного проверки
Это все содержимое статьи, надеюсь, что это поможет вам в изучении, также希望大家多多支持呐喊教程。
Заявление: данное содержимое получено из Интернета, авторские права принадлежат соответствующему владельцу, содержимое предоставлено пользователями Интернета в порядке добровольного вклада и загрузки, сайт не обладает правами собственности, не производится редактирование вручную, и не несет ответственности за соответствующие юридические вопросы. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供相关证据. В случае подтверждения, сайт немедленно удалит涉嫌侵权的内容。