Verschiedene Möglichkeiten zur Implementierung des Java Singleton -Musters
So viele Bücher schreiben:
öffentliche Klasse Singleton1 {private Singleton1 () {} private statische Singleton1 Instance = null; public static singleton1 getInstance () {if (instance == null) {instance = new Singleton1 (); } return Instance; }}Dies ist jedoch nicht in der tatsächlichen Entwicklung geschrieben, da es ein ernstes Problem gibt: Wenn der gleichzeitige Zugriff auf Multi-Threaden zugegriffen wird, können mehrere Instanzen generiert werden! !
Hier sind einige häufig verwendete Methoden:
1. Verwenden Sie synchronisierte Schlüsselwörter
Paket Singleton; öffentliche Klasse Singleton1 {private Singleton1 () {} private statische Singleton1 Instance = null; // Lösung 1 des Multi-Threading-Problems, aber es ist nicht effizient! Weil jeder Anruf gesperrt wird! public static synchronisierte Singleton1 getInstance () {if (instance == null) {instance = new Singleton1 (); } return Instance; } public void print () {System.out.println ("Thread_id:"+thread.currentThread (). getId ()); } private static Object Object = new Object (); // Eine sehr clevere Methode, nur wenn NULL hinzugefügt wird, kein öffentliches statisches Singleton1 getInstance2 () {if (instance == null) {synchronized (Objekt) {instance = new Singleton1 (); }} return Instance; }} 2. Schloss hinzufügen
Paket Singleton; import Java.util.concurrent.locks.reentrantlock; public class Singleton2 {private Singleton2 () {} private statische Reentrantlock lock = new Reentrantlock (); private statische Singleton2 -Instanz = NULL; public void print () {System.out.println ("Thread_id:"+thread.currentThread (). getId ()); } public static Singleton2 getInstance2 () {if (Instance == null) {lock.lock (); if (instance == null) {// Beachten Sie, dass es hier ein anderes Urteil gibt! ! Instance = new Singleton2 (); } lock.unlock (); } return Instance; }} 3. Verwenden Sie statische Variablen:
Paket Singleton; öffentliche Klasse Singleton3 {public static void print () {System.out.println ("Thread_id:"+thread.currentThread (). getId ()); } public static nested GetNested () {return nested.instance; } // Dies ist eine Klasse, die von einer Singleton Static Class Nested {privat nested () {} static nested Instance = newnestion () erstellt wurde; }}Das obige ist das häufig verwendete Erstellungsmuster von Singleton:
Test -Testcode:
Paket Singleton; Singleton.singleton3.Nested; public class test2 {public static void main (String [] args) {// Todo automatisch generierte Methode Stub verschachtelte Singleton; Myrunnable mm = new Myrunnable (); Myrunnable M1 = neuer Myrunnable (); Myrunnable2 m2 = neuer Myrunnable2 (); neuer Thread (M1) .Start (); neuer Thread (M2) .Start (); if (m1.singleton == m2.singleton) {// Es ist das gleiche System.out.println ("ist das gleiche"); } else {System.out.println ("ist nicht gleich"); }}} Klasse myrunnable implements runnable {verschachtelter Singleton; @Override public void run () {// Todo automatisch generierte Methode Stub Singleton = Singleton3.getNested (); Singleton3.Print (); }} Klasse myrunnable2 implementiert runnable {verschachtelter Singleton; @Override public void run () {// Todo automatisch generierte Methode Stub Singleton = Singleton3.getNested (); Singleton3.Print (); }}Ausgabe:
Es ist dasselbe
Thread_id: 11
Thread_id: 10
Das obige ist eine Zusammenstellung der Java Singleton -Modellinformationen. Wir werden in Zukunft weiterhin relevante Informationen hinzufügen. Vielen Dank für Ihre Unterstützung für diese Website!