концепция:
Синглтонский рисунок в Java - общий дизайн. Синглтонский рисунок разделен на три типа: Lazy Singleton, Hungry Singleton и зарегистрированный Singleton.
Синглтонский режим имеет следующие характеристики:
1. В классе Синглтона может быть только один экземпляр.
2. Класс Синглтона должен создать свой собственный уникальный экземпляр.
3. Класс Синглтона должен предоставить этот экземпляр всем другим объектам.
Одиночный паттерн гарантирует, что у класса есть только один экземпляр, и создает его сам и предоставляет этот экземпляр всей системе. В компьютерных системах объекты драйверов для пулов потоков, кэши, объектов журнала, диалоговых окно, принтеров и графических карт часто разработаны как синглтоны. Эти приложения имеют более или менее функциональность менеджера ресурсов. Каждый компьютер может иметь несколько принтеров, но может быть доступен только один капул принтера, чтобы избежать двух заданий для печати одновременно. Каждый компьютер может иметь несколько портов связи, и система должна централизованно управлять этими портами связи, чтобы избежать одного порта связи одновременно двумя запросами. Короче говоря, выбор модели синглтона - это избегать противоречивых государств и избежать политической быстрой.
Вот два типа вступлений: ленивые и голодные
1. Нагрузка немедленно/Голодный стиль
Перед вызовом метода экземпляр был создан, код:
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {// Загрузка сейчас == Злой режим Private Static MyObject myObject = new myObject (); private myObject () {} public static myObject getInstance () {// версия кода сейчас загружается //. Метод getInstance () не является синхронизированным // Следовательно, могут возникнуть проблемы без тридовых, возвращаем myobject;}} Создать класс потоков
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс Mythread Extends Thread {@OverridePublic void run () {System.out.println (myobject.getInstance (). Hashcode ());}} Создать класс пробега
пакет com.wishiyao.learn.day.singleton.ep; открытый класс run {public static void main (string [] args) {mythread t = new mythread (); mythread t = new mythread (); mythread t = new mythread (); t.start (); t.start (); t.start ();); t.start ();}} Результаты бега
1 167772895
2 167772895
3 167772895
HashCode - это то же значение, что означает, что объект также одинаковый, что означает, что реализуется режим мгновенной загрузки.
2. ленивая загрузка/ленивая
Экземпляр будет создан после того, как метод будет вызван. План реализации может заключаться в том, чтобы поместить экземпляры в конструктор без параметра, так что экземпляр объекта будет создан только при вызове метода. Код:
пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {private static myobject myobject; private myobject () {} public static myObject getInstance () {// задержка загрузки if (myObject! Создать класс потоков
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс Mythread Extends Thread {@OverridePublic void run () {System.out.println (myobject.getInstance (). Hashcode ());}} Создать класс пробега
Пакет com.wishiyao.learn.day8.singleton.ep2; public class run {public static void main (string [] args) {mythread t1 = new mythread (); t1.start ();}} Результаты бега
1 167772895
Хотя принимается экземпляр объекта, если он находится в многопоточной среде, произойдет несколько случаев, что не является синглтонским шаблоном
Запустите тестовый класс
Пакет com.wishiyao.learn.day.singleton.ep; public class run {public static void main (string [] args) {mythread t = new Mythread (); mythread t = new Mythread (); Mythread t = new Mythread (); Mythread t = new Mythread (); Mythread (); T.Start (); T.Start (); T.Start (); T.Start (); t.start (); t.start (); }} Результаты бега
1 980258163
2 1224717057
3 1851889404
4 188820504
5 1672864109
Поскольку есть проблема, нам нужно решить проблему. Многопоточное решение в ленивом режиме, код:
Первое решение, чаще всего, добавить синхронизированный, и синхронизированный может быть добавлен в разные позиции
Первый метод блокирует
пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {private static myobject myobject; private myobject () {} синхронизированный общедоступный static myobject getInstance () {// задержка загрузки try {if (myobject! = null) {} else {// symulation некоторая подготовка {if myobject! myobject = new myObject (); }} catch (прерывание Exception e) {e.printStackTrace ();} return myObject;}} Эта схема синхронизированной синхронизации приводит к слишком неэффективной, и весь метод заблокирован
Вторая схема использования синхронизированной
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {private static myobject myobject; private myobject () {} public static myObject getInstance () {// задержка загрузки try {// compater use use use {///// {// symute shipe {//// или simutator {/// cymute us symute us us {/// {// simtaration) Thread.sleep (); myobject = new myobject ();}}} catch (прерывание Exception e) {e.printstacktrace ();} return myobject;}} Этот метод также очень низкая. Все коды в методе заблокированы. Вам нужно только заблокировать код ключа. Третий план использования синхронизации
пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {private static myobject myobject; private myobject () {} public static myObject getInstance () {// задержка загрузки try {if (myObject! {myObject = new myObject ();}}} catch (прерывание Except e) {e.printStackTrace ();} return myObject;}} Кажется, это лучшее решение, но после запуска я обнаружил, что на самом деле это не загруженное.
результат:
1 1224717057
2 971173439
3 1851889404
4 1224717057
5 1672864109
Почему?
Хотя утверждение, которое создает объект, заблокирован, только один поток может заполнить создание за раз, после того, как первый поток входит для создания объекта объекта, второй поток все еще может продолжать создавать его, потому что мы только блокируем оператор создания, решение этой проблемы решения
пакет com.wishiyao.learn.day.singleton.ep; public class myobject {private static myobject myobject; private myobject () {} public static myObject getInstance () {// задержка загрузки try {if (myobject! (Myobject.class) {if (myobject == null) {myobject = new myobject ();}}}} catch (прерывание Exception e) {e.printstacktrace ();} return myobject;}} Просто добавьте еще одно суждение в замок, чтобы обеспечить синглтон. Это механизм двойной проверки DCL
Результаты следующие:
1 1224717057
2 1224717057
3 1224717057
4 1224717057
5 1224717057
3. Используйте встроенные статические классы для реализации отдельных корпусов
Главный код
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {// Метод внутреннего класса Частный статический класс myobjecthandler {private static myobject = new myobject ();} public myobject () {} public static myObject getInstance () {return myObjectler.myobject; Код класса потока
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс Mythread Extends Thread {@OverridePublic void run () {System.out.println (myobject.getInstance (). Hashcode ());}} Запустить класс
Пакет com.wishiyao.learn.day.singleton.ep; public class run {public static void main (string [] args) {mythread t = new Mythread (); mythread t = new Mythread (); Mythread t = new Mythread (); Mythread t = new Mythread (); Mythread (); T.Start (); T.Start (); T.Start (); T.Start (); t.start (); t.start (); }} результат
1851889404
1851889404
1851889404
1851889404
1851889404
Благодаря внутренним статическим классам получается безрезультатный шаблон одиночной
IV Сериализовать и десериализовать синглтонские узоры
Встроенные статические классы могут достичь проблем безопасности потока, но если вы сталкиваетесь с сериализованными объектами, результатом, полученным с использованием метода по умолчанию, все еще несколько случаев.
MyObject Code
пакет com.wishiyao.learn.day8.singleton.ep5; import java.io.serializable; открытый класс myobject реализует сериализуемые {/****/частный статический конечный долгосрочный серийный {} public static myObject getInstance () {return myobjecthandler.myobject;} // защищенный myobject readresolve () {// system.out.println («Метод чтения был вызван!»); // return myobjecthandler.myobject; //}}}}}}}}}}}}}}} Бизнес
пакет com.wishiyao.learn.day.singleton.ep; import java.io.file; импорт java.io.fileinputstream; импорт java.io.filenotfoundexception; импорт java.io.fileoutputstream; импорт java.io.ioexcept SaveAndread {public static void main (string [] args) {try {myObject myObject = myObject.getInstance (); fileOutputStream fosref = new FileOutputStream (new File ("myObjectFile.txt"); objectOutptream oosRef = new File ("myObjectFile.txt"); ObjectOutputStream (foSref); oosRef.WriteObject (myObject); oosRef.close (); fosref.close (); System.out.println (myobject.hashcode ());} catch (filenotfoundexception e) {e.printstacktrace (); {e.printstackTrace ();} fileInputStream fisref; try {fisref = new FileInputStream (new File ("myObjectFile.txt")); objectInputStream iosRef = new ObjectInputStream (fisRef); myObject myObject = (myObject) iosref.readobject (); iosref.close (); fisref.close (); System.out.println (myobject.hashcode ());} catch (filenotfoundexception e) {e.printstacktrace ();} catchexception e) {e.printStacktrace (); {e.printstacktrace ();}}} результат
1 970928725
2 1099149023
Два разных хэшкода доказывают, что они не один и тот же объект. Решение, добавьте следующий код
Защищенный myobject readresolve () {System.out.println («Метод чтения был вызван!»); вернуть myobjecthandler.myobject;} Вызванный во время десериализации, вы можете получить тот же объект
System.out.println (myobject.readresolve (). Hashcode ());
результат
1 1255301379
2 был вызван метод чтения!
3 1255301379
Тот же хэшкод доказывает, что получен тот же объект
5. Используйте статические кодовые блоки для реализации отдельного корпуса
Код в статическом блоке кода уже выполняется при использовании класса, поэтому функция статического кода Fast можно использовать для реализации простого режима прибыли.
MyObject Class
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс myobject {private static myobject exants = null; private myobject () {super ();} static {exanter = new myobject ();} public static myobject getInstance () {exantement;}} Нить класс
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс Mythread Extends Thread {@OverridePublic void run () {for (int i =; i <; i ++) {System.out.println (myobject.getinstance (). Hashcode ());}}}}}}}}}}}} Запустить класс
Пакет com.wishiyao.learn.day.singleton.ep; public class run {public static void main (string [] args) {mythread t = new Mythread (); mythread t = new Mythread (); Mythread t = new Mythread (); Mythread t = new Mythread (); Mythread (); T.Start (); T.Start (); T.Start (); T.Start (); t.start (); t.start (); }} Результаты работы:
1 1678885403
2 1678885403
3 1678885403
4 1678885403
5 1678885403
6 1678885403
7 1678885403
8 1678885403
9 1678885403
10 1678885403
11 1678885403
12 1678885403
13 1678885403
14 1678885403
15 1678885403
16 1678885403
17 1678885403
18 1678885403
19 1678885403
20 1678885403
21 1678885403
22 1678885403
23 1678885403
24 1678885403
25 1678885403
Синглтонский шаблон, безопасный для потока, успешно получен с помощью функции только выполнения статических кодовых блоков один раз.
6. Используйте Enum enum типы данных для реализации режима Singleton
Характеристики перечисления и статического кодового блока аналогичны. При использовании enums конструктор будет вызван автоматически, а также может использоваться для реализации режима Singleton.
MyObject Class
package com.weishiyao.learn.day.singleton.ep;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public enum MyObject {connectionFactory;private Connection connection;private MyObject() {try {System.out.println("The construct of MyObject was called");String url = "jdbc: mysql: // ...:/weChat_? useUnicode = true & ancervencoding = utf-"; string name = "root"; string password = ""; string drivername = "com.mysql.jdbc.driver"; class.forname (drivername); connection manager.getConnection (url, name); {e.printstacktrace ();} catch (sqlexception e) {e.printstacktrace ();}} public connection getConnection () {return Connection;}} Нить класс
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс Mythread Extends Thread {@OverridePublic void run () {for (int i =; i <; i ++) {System.out.println (myobject.connectionFactory.getConnect Запустить класс
Пакет com.wishiyao.learn.day.singleton.ep; public class run {public static void main (string [] args) {mythread t = new Mythread (); mythread t = new Mythread (); Mythread t = new Mythread (); Mythread t = new Mythread (); Mythread (); T.Start (); T.Start (); T.Start (); T.Start (); t.start (); t.start (); }} Результаты бега
1 была вызвана конструкция MyObject
2 56823666
3 56823666
4 56823666
5 56823666
6 56823666
7 56823666
8 56823666
9 56823666
10 56823666
11 56823666
12 56823666
13 56823666
14 56823666
15 56823666
16 56823666
17 56823666
18 56823666
19 56823666
20 56823666
21 56823666
22 56823666
23 56823666
24 56823666
25 56823666
26 56823666
Приведенный выше метод письма раскрывает класс перечисления, который нарушает «принцип единственной ответственности». Вы можете использовать класс, чтобы обернуть перечисление.
пакет com.wishiyao.learn.day.singleton.ep; import java.sql.connection; импорт java.sql.drivermanager; импорт java.sql.sqlexception; public class myobject {public enum myenumsingleton {connectory factor; private connection; private myenumsingleton () {try.tys.ath {{try.tembint {{try.ty.aute. MyObject назывался "); String url =" jdbc: mysql: // ...:/weChat_? UseUnicode = true & harementencoding = utf- "; string name =" root "; string password =" "; string rivername =" com.mysql.jdbc.driver "; class.forname (rivername); (Classnotfoundexception e) {e.printstacktrace ();} catch (sqlexception e) {e.printstacktrace ();}} public connection getConnection () {return connect Измените код потока
Пакет com.wishiyao.learn.day.singleton.ep; открытый класс Mythread Extends Thread {@OverridePublic void run () {for (int i =; i <; i ++) {System.out.println (myobject.getConnection (). Hashcode ());}}}}}}}}}}}}}} результат
1 была вызвана конструкция MyObject
2 1948356121
3 1948356121
4 1948356121
5 1948356121
6 1948356121
7 1948356121
8 1948356121
9 1948356121
10 1948356121
11 1948356121
12 1948356121
13 1948356121
14 1948356121
15 1948356121
16 1948356121
17 1948356121
18 1948356121
19 1948356121
20 1948356121
21 1948356121
22 1948356121
23 1948356121
24 1948356121
25 1948356121
26 1948356121
Вышеупомянутые суммируют различные ситуации и решения, встречающиеся при объединении однообеспеченного режима с многопоточным, чтобы его можно было рассмотреть при использовании позже.