Implementierung des Singleton -Modus (5 Typen)
Häufig verwendet:
Hungriger Stil (Faden sicher, Effizienz mit hoher Anruf, kann aber nicht verzögert geladen werden)
Fauler Stil (Thread sicher, Effizienz mit niedrigem Anruf, kann in Verzögerung geladen werden)
andere:
Double Detection Lock -Typ (aufgrund des zugrunde liegenden internen Modells von JVM wird es gelegentlich Probleme geben und nicht gebaut und verwendet)
Statische interne Klasse (Thread-Safe, Effizienz mit hoher Anruf, kann jedoch verzögert geladen werden)
Enzählende Singletons (Thread-Safe, hohe Anrufeffizienz und können nicht in Verzögerung geladen werden)
Der spezifische Code des Singleton of Hungry Man lautet wie folgt:
Paket com.lcx.mode; /** * * Ein Singleton hungriger Menschen. Unabhängig davon, ob dieses Objekt in Zukunft verwendet wird oder nicht, erstellen wir von Anfang an eine Instanz dieses Objekts. * Bei Bedarf geben wir das erstellte Instanzobjekt zurück, so dass wir relativ hungrig sind, so dass dies als Singleton hungriger Menschen bezeichnet wird. * @Author qq1013985957 * */ Public Class SingletonHanger {private statische Finale SingletonHanger Instance = new SingletonHanger (); private SingletonHanger () {} public static SingletonHanger getInstance () {return Instance; }} /*** Lazy Han-Stil Singleton, wenn ein Singleton-Objekt benötigt wird, wird das einzige Singleton-Objekt erstellt und später erneut anrufen, und das zurückgegebene Singleton-Objekt ist auch das erste erstellte Singleton-Objekt* initialisiert das statische Mitglied zu Null und erstellt es, wenn ein Singleton erhalten wird, so namens Lazy Han-Style. * @Author qq1013985957 * */ class SingletonLazy {private statische SingletonLazy Instance = null; private SingletonLazy () {} /*** Der mit dieser Methode implementierte Singleton kann nicht in mehreren Threads verwendet werden. Mehrere Zeilen können gleichzeitig die IF -Methode eingeben, wodurch mehrere Singleton -Objekte generiert werden. * @return */ public static SingletonLazy getInstance1 () {if (Instance == null) {Instance = new SingletonLazy (); } return Instance; } /*** Jeder wird an die Synchronisation denken. Die synchrone Methode kann Multi-Thread-Singleton implementieren* Diese Methode ist jedoch nicht wünschenswert und beeinflusst die Leistung ernsthaft. Da die Methode jedes Mal überprüft werden muss, wenn Sie ein Singleton erhalten, können Sie nur den synchronisierten Codeblock verwenden, um die Synchronisation zu erreichen. * @return */ public static synchronisierte SingletonLazy getInstance2 () {if (instance == null) {instance = new SingletonLazy (); } return Instance; } /*** Verwenden Sie den synchronisierten Codeblock, um den synchronisierten Codeblock in der IF -Methode zu verwenden, um festzustellen, ob ein Singleton existiert, und überprüfen Sie erneut im synchronisierten Codeblock, ob das Singleton generiert wurde. * Dies ist die Methode des Double Checking Locking im Internet * @return */ public static synchronisierte SingletonLazy getInstance3 () {if (instance == null) {synchronized (SingletonLazy.class) {if (Instance == null) {instance = new SingletonLazy (); }}} return Instance; }} /*** Verwenden Sie die Aufzählungen, um den Singleton -Modus zu implementieren. Dies ist auch die empfohlene Möglichkeit, in einer effektiven Java* -Feuchtigkeit nach der spezifischen Situation zu verwenden. Für Schüler, die mit Enums nicht vertraut sind, können Sie sich auf das vorläufige Verständnis meines Blogs Java Enumeration -Kurs beziehen. * Seine Vorteile: Es ist prägnanter und bietet einen Serialisierungsmechanismus für freie und verhindern die mehrfache Instanziierung, selbst angesichts komplexer Sequenz- und Reflexionsangriffe. * @Author qq1013985957 * */ enum singletionionenum {Singletionionenum ("Singleton Enum"); private String str; private singletionionionInum (String str) {this.setstr (str); } public String getSstr () {return str; } public void setStr (String str) {this.str = str; }} Das obige Singleton -Muster wird nicht getestet. Sie können es testen, um festzustellen, ob der HashCode des Objekts konsistent ist, um festzustellen, ob es dasselbe Objekt ist.
Die bösen und faulen Methoden können nicht verhindern, dass Reflexion mehrere Instanzen implementiert. Durch die Reflexion kann das Einstellen der zugänglichen Methode den privaten Konstruktor aufrufen. Sie können den Konstruktor ändern, um eine Ausnahme auszulegen, wenn er aufgefordert wird, eine zweite Instanz zu erstellen.
Tatsächlich kann dies keinen Singleton garantieren. Nach der Serialisierung kann die Deserialisierung eine neue Instanz erstellen und der Singleton -Klasse ReadResolve () -Methode hinzufügen, um dies zu verhindern.
Der Lazy Man-Stil-Singleton-Code lautet wie folgt:
Paket com.lcx.mode; Import Java.io.file; import Java.io.FileInputStream; importieren java.io.fileoutputStream; importieren java.io.objectinputStream; importieren java.io.objectoutputStream; importieren java.io.serializable; Import Java.lang.reflect.Constructor; importieren java.lang.reflect.invocationTargetException; /*** Lazy Man-Stil-Singletons werden erstellt, wenn ein Singleton-Objekt benötigt wird. Wenn ein Singleton -Objekt benötigt wird, wird es später erneut aufgerufen. Das zurückgegebene Singleton-Objekt ist auch das erste erstellte Singleton-Objekt* initialisiert das statische Mitglied in Null und erstellt es, wenn ein Singleton erhalten wird, so dass es als fauler Man-Stil bezeichnet wird. * @Author qq1013985957 * */ public class Singleton implementiert serialisierbare {/ ** * */ private statische endgültige lange Serialversionuid = -5271537207137321645L; private statische Singleton -Instanz = NULL; private statische int i = 1; private Singleton () { / *** Reflexionsangriffe verhindern, nur einmal den Konstruktor rennen und aufrufen, Ausnahme beim zweiten Mal auslegen* / if (i == 1) {i ++; } else {werfen neu runTimeexception ("Konstruktor kann nur einmal aufgerufen werden"); } System.out.println ("Singletons privater Konstruktor aufrufen"); } /*** Verwenden Sie den synchronisierten Codeblock, um den synchronisierten Codeblock in der IF -Methode zu verwenden, um festzustellen, ob ein Singleton existiert, und überprüfen Sie erneut im synchronisierten Codeblock, ob das Singleton generiert wurde. * Dies nennt das Internet die Double Check -Locking -Methode * @return */ public static synchronisierte Singleton getInstance () {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {Instance = new Singleton (); }} return Instance; } /*** verhindern, dass sich das Desequence neue Singleton -Objekte erzeugt. Dies ist das, was in dem Buch effektiver Java gesagt wird. Diese Methode kann verhindert werden. Ich verstehe die spezifischen Details * @return */ private Object ReadResolve () {return Instance; } public static void main (String [] args) löst eine Ausnahme aus {Test1 (); test2 (); } / *** Testen von Dessequence ist immer noch Singleton -Modus* @throws Exception* / public static void test2 () löst Ausnahme aus {Singleton S = Singleton.getInstance (); ObjectOutputStream ObjectOutputStream = new ObjectOutputStream (neuer FileOutputStream (neue Datei ("e: //singleton.txt")); ObjectOutputStream.WriteObject (s); ObjectInputStream ObjectInputStream = new ObjectInputStream (neuer FileInputStream (neue Datei ("e: //singleton.txt"))); Object readObject = ObjectInputStream.ReadObject (); Singleton S1 = (Singleton) ReadObject; System.out.println ("S.HashCode ():"+S.HashCode ()+", s1.hashcode ():"+s1.hashcode ()); ObjectOutputStream.flush (); ObjectOutputStream.close (); ObjectInputStream.close (); ObjectInputStream.close (); } / *** Testreflexionsangriff* @Throws Exception* / public static void test1 () {Singleton S = Singleton.getInstance (); Klasse C = Singleton.class; Konstruktor -Privatestruktor; try {privateConstructor = C.GetDeclaredConstructor (); privateConstructor.setAccessible (wahr); privateConstructor.newinstance (); } catch (Ausnahme e) {e.printstacktrace (); }}}Überprüfen Sie die Ergebnisse des Reflexionangriffs:
Wenn das Ergebnis der ReadResolve -Methode nicht hinzugefügt wird:
Das Ergebnis des Hinzufügens von ReadResolve -Methoden:
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!