концепция:
Синглтонский рисунок в Java - общий дизайн. Синглтонский рисунок разделен на три типа: Lazy Singleton, Hungry Singleton и зарегистрированный Singleton.
Синглтонский режим имеет следующие характеристики:
1. В классе Синглтона может быть только один экземпляр.
2. Класс Синглтона должен создать свой собственный уникальный экземпляр.
3. Класс Синглтона должен предоставить этот экземпляр всем другим объектам.
Одиночный паттерн гарантирует, что у класса есть только один экземпляр, и создает его сам и предоставляет этот экземпляр всей системе. В компьютерных системах объекты драйверов для пулов потоков, кэши, объектов журнала, диалоговых окно, принтеров и графических карт часто разработаны как синглтоны. Эти приложения имеют более или менее функциональность менеджера ресурсов. Каждый компьютер может иметь несколько принтеров, но может быть доступен только один капул принтера, чтобы избежать двух заданий для печати одновременно. Каждый компьютер может иметь несколько портов связи, и система должна централизованно управлять этими портами связи, чтобы избежать одного порта связи одновременно двумя запросами. Короче говоря, выбор модели синглтона - это избегать противоречивых государств и избежать политической быстрой.
Вот два типа вступлений: ленивые и голодные
1. Нагрузка немедленно/Голодный стиль
Перед вызовом метода экземпляр был создан, код:
пакет com.wishiyao.learn.day8.singleton.ep1; открытый класс myobject {// Загрузка сейчас == Evil Mode private static myObject myObject = new myObject (); private myobject () {} public static myObject getInstance () {// Эта кодовая версия загружается сейчас // недостаток этой версии кода заключается в том, что не может быть других переменных экземпляра //, поскольку метод getInstance () не является синхронизированным //, не могут возникнуть проблемы с неповдостными. }} Создать класс потоков
пакет com.wishiyao.learn.day8.singleton.ep1; открытый класс Mythread Extends Thread {@override public void run () {System.out.println (myobject.getInstance (). Hashcode ()); }} Создать класс пробега
пакет com.wishiyao.learn.day8.singleton.ep1; public class run {public static void main (string [] args) {mythread t1 = new mythread (); Mythread t2 = new Mythread (); Mythread T3 = New Mythread (); t1.start (); t2.start (); t3.start (); }} Результаты бега
167772895
167772895
167772895
HashCode - это то же значение, что означает, что объект также одинаковый, что означает, что реализуется режим мгновенной загрузки.
2. ленивая загрузка/ленивая
Экземпляр будет создан после того, как метод будет вызван. План реализации может заключаться в том, чтобы поместить экземпляры в конструктор без параметра, так что экземпляр объекта будет создан только при вызове метода. Код:
пакет com.wishiyao.learn.day8.singleton.ep2; открытый класс myobject {private static myobject myobject; private myObject () {} public static myObject getInstance () {// задержка загрузки if (myObject! = null) {} else {myObject = new myObject (); } вернуть myObject; }} Создать класс потоков
пакет com.wishiyao.learn.day8.singleton.ep2; открытый класс Mythread Extends Thread {@Override public 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 (); }}Результаты бега
167772895
Хотя принимается экземпляр объекта, если он находится в многопоточной среде, произойдет несколько случаев, что не является синглтонским шаблоном
Запустите тестовый класс
пакет com.wishiyao.learn.day8.singleton.ep2; public class run {public static void main (string [] args) {mythread t1 = new mythread (); Mythread t2 = new Mythread (); Mythread T3 = New Mythread (); Mythread T4 = новый Mythread (); Mythread T5 = new Mythread (); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); }}Результаты бега
980258163
1224717057
1851889404
188820504
1672864109
Поскольку есть проблема, нам нужно решить проблему. Многопоточное решение в ленивом режиме, код:
Первое решение, чаще всего, добавить синхронизированный, и синхронизированный может быть добавлен в разные позиции
Первый метод блокирует
пакет com.wishiyao.learn.day8.singleton.ep3; открытый класс myobject {private static myobject myobject; private myObject () {} синхронизированный публичный статический myObject getInstance () {// задержка загрузки try {if (myobject! = null) {} else {// Моделируйте некоторую подготовку перед созданием потока объекта. Sleep (2000); myobject = new myObject (); }} catch (прерывание Exception e) {e.printStackTrace (); } вернуть myObject; }}Эта схема синхронизированной синхронизации приводит к слишком неэффективной, и весь метод заблокирован
Вторая схема использования синхронизированной
пакет com.wishiyao.learn.day8.singleton.ep3; открытый класс myobject {private static myobject myobject; private myObject () {} public static myObject getInstance () {// задержка загрузки try {synchronized (myobject.class) {if (myobject! = null) {} else {// Совместное использование некоторых работ подготовки перед созданием объекта. myobject = new myObject (); }}} catch (прерывание Exception e) {e.printstackTrace (); } вернуть myObject; }} Этот метод также очень низкая. Все коды в методе заблокированы. Вам нужно только заблокировать код ключа. Третий план использования синхронизации
пакет com.wishiyao.learn.day8.singleton.ep3;
открытый класс myObject {private static myObject myObject; private myObject () {} public static myObject getInstance () {// задержка загрузки try {if (myObject! = null) {} else {// смоделировать некоторую подготовку перед созданием поток объекта. Sleep (2000); синхронизированный (myobject.class) {myObject = new myObject (); }}} catch (прерывание Exception e) {e.printstackTrace (); } вернуть myObject; }}Кажется, это лучшее решение, но после запуска я обнаружил, что на самом деле это не загруженное.
результат:
1224717057
971173439
1851889404
1224717057
1672864109
Почему?
Хотя утверждение, которое создает объект, заблокирован, только один поток может заполнить создание за раз, после того, как первый поток входит для создания объекта объекта, второй поток все еще может продолжать создавать его, потому что мы только блокируем оператор создания, решение этой проблемы решения
пакет com.wishiyao.learn.day8.singleton.ep3; открытый класс myobject {private static myobject myobject; private myObject () {} public static myObject getInstance () {// задержка загрузки try {if (myObject! = null) {} else {// Симуляция некоторой подготовки перед созданием поток объекта. Sleep (2000); синхронизированный (myobject.class) {if (myobject == null) {myObject = new myObject (); }}}} catch (прерывание Exception e) {e.printstackTrace (); } вернуть myObject; }}Просто добавьте еще одно суждение в замок, чтобы обеспечить синглтон. Это механизм двойной проверки DCL
Результаты следующие:
1224717057
1224717057
1224717057
1224717057
1224717057
3. Используйте встроенные статические классы для реализации отдельных корпусов
Главный код
пакет com.wishiyao.learn.day8.singleton.ep4; открытый класс myobject {// метод внутреннего класса частное статический класс myobjecthandler {частный статический myobject myobject = new myobject (); } public myObject () {} public static myObject getInstance () {return myobjecthandler.myobject; }} Код класса потока
пакет com.wishiyao.learn.day8.singleton.ep4; открытый класс Mythread Extends Thread {@override public void run () {System.out.println (myobject.getInstance (). Hashcode ()); }} Запустить класс
пакет com.wishiyao.learn.day8.singleton.ep4; public class run {public static void main (string [] args) {mythread t1 = new mythread (); Mythread t2 = new Mythread (); Mythread T3 = New Mythread (); Mythread T4 = новый Mythread (); Mythread T5 = new Mythread (); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); }}результат
1851889404
1851889404
1851889404
1851889404
1851889404
Благодаря внутренним статическим классам получается безрезультатный шаблон одиночной
IV Сериализовать и десериализовать синглтонские узоры
Встроенные статические классы могут достичь проблем безопасности потока, но если вы сталкиваетесь с сериализованными объектами, результатом, полученным с использованием метода по умолчанию, все еще несколько случаев.
MyObject Code
пакет com.wishiyao.learn.day8.singleton.ep5; импорт java.io.serializable; открытый класс myobject реализует serializable { / ** * * / private static final long serialversionuid = 888L; // Метод внутреннего класса частный статический класс myobjecthandler {private static myObject myObject = new myObject (); } public myObject () {} public static myObject getInstance () {return myobjecthandler.myobject; } // Защищенный myobject readresolve () {// system.out.println («Метод чтения был вызван!»); // return myobjecthandler.myobject; //}} Бизнес
Пакет com.wishiyao.learn.day8.singleton.ep5; import java.io.file; импорт java.io.fileinputstream; импорт java.io.filenotfoundexception; импорт java.io.fileOutputStream; импорт java.io.ioexception; import java.objectInpurem; SaveAndread {public static void main (string [] args) {try {myObject myObject = myObject.getInstance (); FileOutputStream foSref = new FileOutputStream (new File ("myObjectFile.txt")); ObjectOutputStream oosRef = new objectOutputStream (foSref); oosref.writeObject (myObject); oosref.close (); fosref.close (); System.out.println (myobject.hashcode ()); } catch (filenotFoundException e) {e.printstackTrace (); } catch (ioException e) {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 (); } catch (ioException e) {e.printstackTrace (); } catch (classnotfoundexception e) {e.printstacktrace (); }}}результат
970928725
1099149023
Два разных хэшкода доказывают, что они не один и тот же объект. Решение, добавьте следующий код
Защищенный myobject readresolve () {System.out.println («Метод ReadResolve был вызван!»); вернуть myobjecthandler.myobject; }Вызванный во время десериализации, вы можете получить тот же объект
System.out.println (myobject.readresolve (). Hashcode ());
результат
1255301379
Метод ReadResolve был вызван!
1255301379
Тот же хэшкод доказывает, что получен тот же объект
5. Используйте статические кодовые блоки для реализации отдельного корпуса
Код в статическом блоке кода уже выполняется при использовании класса, поэтому функция статического кода Fast можно использовать для реализации простого режима прибыли.
MyObject Class
пакет com.wishiyao.learn.day8.singleton.ep6; открытый класс myobject {private static myobject ancess = null; private myobject () {super (); } static {encos = new myObject (); } public static myObject getInstance () {return Encement; }} Нить класс
Пакет com.wishiyao.learn.day8.singleton.ep6; открытый класс Mythread Extends Thread {@override public void run () {for (int i = 0; i <5; i ++) {System.out.println (myobject.getNstance (). Hashcode ()); }}} Запустить класс
пакет com.wishiyao.learn.day8.singleton.ep6; public class run {public static void main (string [] args) {mythread t1 = new mythread (); Mythread t2 = new Mythread (); Mythread T3 = New Mythread (); Mythread T4 = новый Mythread (); Mythread T5 = new Mythread (); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); }}Результаты работы:
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
1678885403
Синглтонский шаблон, безопасный для потока, успешно получен с помощью функции только выполнения статических кодовых блоков один раз.
6. Используйте Enum enum типы данных для реализации режима Singleton
Характеристики перечисления и статического кодового блока аналогичны. При использовании enums конструктор будет вызван автоматически, а также может использоваться для реализации режима Singleton.
MyObject Class
пакет com.wishiyao.learn.day8.singleton.ep7; import java.sql.connection; импорт java.sql.drivermanager; import java.sql.sqlexception; public eNum myobject {connectionFactory; частное соединение; private myObject () {try {System.out.println («Конструкция myObject называлась»); String url = "jdbc: mysql: //172.16.221.19: 3306/weChat_1? UseUnicode = true & ancervencoding = utf-8"; String name = "root"; String password = "111111"; String DriverName = "com.mysql.jdbc.driver"; Class.forname (DriverName); Connection = DriverManager.getConnection (URL, имя, пароль); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); }} public Connection getConnection () {return Connection; }} Нить класс
Пакет com.wishiyao.learn.day8.singleton.ep7; открытый класс Mythread Extends Thread {@override public void run () {for (int i = 0; i <5; i ++) {System.out.println (myobject.connectionFactory.getConnection (). Hashcode ()); }}} Запустить класс
пакет com.wishiyao.learn.day8.singleton.ep7; public class run {public static void main (string [] args) {mythread t1 = new mythread (); Mythread t2 = new Mythread (); Mythread T3 = New Mythread (); Mythread T4 = новый Mythread (); Mythread T5 = new Mythread (); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); }}Результаты бега
Называется конструкцией MyObject
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
56823666
Приведенный выше метод письма раскрывает класс перечисления, который нарушает «принцип единственной ответственности». Вы можете использовать класс, чтобы обернуть перечисление.
пакет com.wishiyao.learn.day8.singleton.ep8; import java.sql.connection; import java.sql.drivermanager; импорт java.sql.sqlexception; public class myobject {public enum myenumsingleton {connectionforty; частное соединение; private myenumsingleton () {try {System.out.println («Конструкция myObject была названа»); String url = "jdbc: mysql: //172.16.221.19: 3306/weChat_1? UseUnicode = true & ancervencoding = utf-8"; String name = "root"; String password = "111111"; String DriverName = "com.mysql.jdbc.driver"; Class.forname (DriverName); Connection = DriverManager.getConnection (URL, имя, пароль); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); }} public Connection getConnection () {return Connection; }} public Static Connection getConnection () {return myenumsingleton.connectionFactory.getConnection (); }} Измените код потока
пакет com.wishiyao.learn.day8.singleton.ep8; открытый класс Mythread Extends Thread {@override public void run () {for (int i = 0; i <5; i ++) {System.out.println (myobject.getConnection (). Hashcode ()); }}} В результате конструкция MyObject называется
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
1948356121
Вышеупомянутые суммируют различные ситуации и решения, встречающиеся при объединении однообеспеченного режима с многопоточным, чтобы его можно было рассмотреть при использовании позже.