Несколько способов внедрения шаблона Java Singleton
Это сколько книг пишут:
открытый класс singleton1 {private singleton1 () {} private static singleton1 exants = null; public static singleton1 getInstance () {if (ancess == null) {exance = new singleton1 (); } return Encement; }}Тем не менее, это не написано в реальной разработке, потому что существует серьезная проблема: когда доступ к многопоточному параллельному доступу можно получить, могут быть сгенерированы несколько случаев! !
Вот несколько часто используемых методов:
1. Используйте синхронизированные ключевые слова
Пакет Singleton; открытый класс singleton1 {private singleton1 () {} private static singleton1 exants = null; // Решение 1 проблемы с мультипотчиком, но это не эффективно! Потому что каждый звонок будет заблокирован! public static synchronized singleton1 getInstance () {if (exance == null) {encess = new singleton1 (); } return Encement; } public void print () {system.out.println ("thread_id:"+thread.currentThread (). getId ()); } частный статический объект объекта = new Object (); // очень умный метод, только при добавлении нуля, нет публичного статического Singleton1 getInstance2 () {if (ancess == null) {synchronized (object) {exaction = new singleton1 (); }} return Encement; }} 2. Добавить блокировку
Пакет Singleton; Import java.util.concurrent.locks.reentrantlock; открытый класс singleton2 {private singleton2 () {} private static reentrantlock lock = new Reentrantlock (); Частный статический экземпляр Singleton2 = null; public void print () {system.out.println ("thread_id:"+thread.currentthread (). getId ()); } public static singleton2 getInstance2 () {if (ancess == null) {lock.lock (); if (exante == null) {// Обратите внимание, что здесь есть еще одно суждение! ! encess = new Singleton2 (); } lock.unlock (); } return Encement; }} 3. Используйте статические переменные:
Пакет Singleton; открытый класс singleton3 {public static void print () {system.out.println ("thread_id:"+thread.currentthread (). getId ()); } public static getNateStest () {return inSted.Instance; } // Это класс, созданный синглтонским статическим классом indest {private indest () {} static vendest ancess = new indest (); }}Выше приведено общепринятый шаблон создания синглтона:
Тестовый тестовый код:
Пакет Singleton; Импорт Singleton.singleton3.nested; public class test2 {public static void main (string [] args) {// todo Автогенерированный метод загрязняет вложенное синглтон; Myrunnable mm = new myrunnable (); Myrunnable m1 = new myrunnable (); Myrunnable2 m2 = new myrunnable2 (); новая поток (m1) .start (); новая поток (m2) .start (); if (m1.singleton == m2.singleton) {// Это та же System.out.println ("это то же самое"); } else {System.out.println ("не то же самое"); }}} класс MyRunnable Reculsments Runnable {indest Singleton; @Override public void run () {// todo автоматически генерируемый метод stub singleton = singleton3.getnated (); Singleton3.print (); }} класс myrunnable2 реализует runnable {indent singleton; @Override public void run () {// todo автоматически генерируемый метод stub singleton = singleton3.getnated (); Singleton3.print (); }}Выход:
Это то же самое
Threat_id: 11
Threat_id: 10
Выше приведено сборник информации о модели Java Singleton. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за поддержку этого сайта!