Schreiben Sie zuerst einen einzigen Fall:
öffentliche Klasse Singleledemo {privat static Singledemo S = NULL; private Singledemo () {} public static Singledemo getInstance () {if (s == null) {s = new Singledemo (); } return s; }}Schreiben Sie eine Testklasse:
public class ThreadDemo3 {public static void main (String [] args) {Singleledemo S1 = SingleLledemo.getInstance (); Singledemo S2 = Singledemo.getInstance (); System.out.println (S2 == S2); }}Das laufende Ergebnis ist immer wahr, was bedeutet, dass es unter einem einzigen Thread kein Problem gibt. Schreiben wir ein Multi-Thread, um auf den Einzelfall zuzugreifen.
public class threadtest implements runnable {// speichern Singleton -Objekte, die Verwendung von SET ist es, doppelte Elemente nicht zu speichern. @Override public void run () {// Singledemo s = Singledemo.getInstance (); // Hinzufügen von Singleton Singles.add (s); }}Verwenden Sie den gleichzeitigen Zugang zu Singletons mit mehrstitHeraded:
public class ThreadDemo3 {public static void main (String [] args) {// Singleledemo S1 = Singledemo.getInstance (); // Singledemo S2 = Singledemo.getInstance (); // system.out.println (S2 == S2); Threadtest t = neuer threadtest (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); neuer Thread (t) .Start (); System.out.println (T.Singles); }}
Die Betriebsergebnisse sind wie folgt:
[com.persagy.thread.singledemo@1bc4459, com.persagy.thread.singledemo@150bd4d]
oder
[com.persagy.thread.singledemo@12b6651]
Dies bedeutet, dass es ein gleichzeitiges Problem mit gleichzeitiger Zugriff gibt, und die erhaltenen Instanzen sind möglicherweise nicht gleich
Wie löst ich Fadensicherheitsprobleme?
Natürlich wird der Synchronisationsschlossmechanismus verwendet.
Das Folgende ist eine Verbesserung des Singleton:
öffentliche Klasse Singleledemo {private statische Singleledemo S = null; privat Singledemo () {} public static synchronisierte Singleledemo getInstance () {if (s == null) {s = new Singledemo ();} return S;}}}}}}}}}}}}}}}}}}}}} Das Problem der Gewindesicherheit wurde nach dem Hinzufügen der synchronen Funktion gelöst
Führen Sie mehrmals aus, um dieselbe Instanz zu erhalten, und es wird keine 2 Instanzen geben.
[com.persagy.thread.singledemo@12b6651]
Bei einem gleichzeitigen Zugang zu Multi-Thread muss jedoch jeder Thread das Schloss jedes Mal beurteilen, wenn er eine Instanz erhält, was relativ geringe Effizienz ist. Um die Effizienz zu verbessern, habe ich eine doppelte Beurteilungsmethode hinzugefügt, um das Problem der Effizienz zu lösen
Der Code ist wie folgt:
öffentliche Klasse Singleledemo {private statische Singleledemo s = null; privat Singledemo () {} public static Singledemo getInstance () {/ * Wenn der erste Thread das Instanzobjekt des Singleton -Singleton erhalten, * Wenn der nachfolgende Thread die Instanz erhält, muss er den Codeblock der Synchronisierungscodeblock nicht eingeben. */if (s == null) {// Das im Synchronisierungscode -Block verwendete Sperre ist das Bytecode -Dateiobjekt des Singleton, und dieses Schloss kann nur verwendet werden, synchronisiert (Singledemo.class) {if (s == null) {s = neu singledemo ();}}} returnDiese Methode löst das Fadensicherheitsproblem der faulen Menschen und verbessert die Effizienz. In der tatsächlichen Entwicklung benutzen mehr Menschen jedoch hungrige Menschen. Schließlich ist dieser Code komplizierter und komplizierter.
Das obige ist der vollständige Inhalt der perfekten Lösung für das Problem der faulen Thread -Sicherheit im Einzelfall -Entwurfsmodus, den der Editor Ihnen mitbringt. Ich hoffe, jeder wird Wulin.com mehr unterstützen ~