Concept de modèle singleton:
Le singleton singleton en Java est un modèle de conception commun. Le singleton singleton est divisé en trois types: Singleton paresseux, singleton affamé et singleton enregistré.
Le mode singleton a les caractéristiques suivantes:
1. Il ne peut y avoir qu'une seule instance dans une classe singleton.
2. La classe Singleton doit créer sa propre instance unique.
3. La classe Singleton doit fournir cette instance à tous les autres objets.
Le modèle Singleton garantit qu'une classe n'a qu'une seule instance et l'instancie elle-même et fournit cette instance à l'ensemble du système. Dans les systèmes informatiques, les objets de pilote pour les pools de threads, les caches, les objets journaliers, les boîtes de dialogue, les imprimantes et les cartes graphiques sont souvent conçues comme des singletons. Ces applications ont plus ou moins la fonctionnalité d'un gestionnaire de ressources. Chaque ordinateur peut avoir plusieurs imprimantes, mais un seul bobineur d'imprimante peut être disponible pour éviter que deux travaux d'impression soient sortis à l'imprimante en même temps. Chaque ordinateur peut avoir plusieurs ports de communication, et le système doit gérer de manière centralisée ces ports de communication pour éviter qu'un port de communication soit appelé simultanément par deux demandes. En bref, le choix d'un modèle singleton est d'éviter les États incohérents et d'éviter une influence politique.
Tout d'abord, regardons une implémentation de singleton classique.
classe publique Singleton {private static singleton uniqueInstance = null; Singleton privé () {// n'existe que pour vaincre l'instanciation. } public static singleton getInstance () {if (uniqueInstance == null) {uniqueInstance = new Singleton (); } retourner uniqueInstance; } // Autres méthodes ...}Singleton évite que la classe soit instanciée en externe en limitant le constructeur au privé. Dans la même portée de la machine virtuelle, la seule instance de Singleton ne peut être accessible que via la méthode getInstance (). (En fait, grâce au mécanisme de réflexion Java, vous pouvez instancier une classe avec une construction privée, qui invalidera essentiellement toutes les implémentations Java Singleton. Ce problème ne sera pas discuté ici, et je pense que le mécanisme de réflexion n'existe pas.)
Cependant, l'implémentation ci-dessus ne tient pas compte des problèmes de sécurité des threads. La sécurité des threads signifie: si votre code est dans un processus où plusieurs threads s'exécutent en même temps, et ces threads peuvent exécuter ce code en même temps. Si le résultat de chaque exécution est le même que le résultat d'une seule exécution de thread et que les valeurs des autres variables sont les mêmes que prévu, elle est en file. En d'autres termes: l'interface fournie par une classe ou un programme est une opération atomique pour un thread ou la commutation entre plusieurs threads ne provoquera pas l'ambiguïté au résultat d'exécution de l'interface, c'est-à-dire que nous n'avons pas besoin de considérer le problème de synchronisation. De toute évidence, la mise en œuvre ci-dessus ne répond pas aux exigences de sécurité du fil, et plusieurs instances de singleton sont susceptibles d'apparaître dans un environnement simultané.
classe publique TestStream {nom de chaîne privée; public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } // Cette classe ne peut avoir qu'une seule instance Private TestStream () {} // Constructeur non argument privé // Cette classe doit être créée en soi // Il existe 2 façons / * TestStream final statique privé TS = new TestStream (); * / Private Static TestStream ts1 = null; // Cette classe doit fournir automatiquement cet objet d'instance à l'ensemble du système System STATIC STATICSTREAM GetTest () {if (ts1 == null) {ts1 = new TestStream (); } return ts1; } public void getInfo () {System.out.println ("Message de sortie" + nom); }} classe publique TestMain {public static void main (String [] args) {testStream s = testStream.getTest (); S.SetName ("Zhang Xiaoxiang"); System.out.println (s.getName ()); TestStream s1 = testStream.getTest (); S1.SetName ("Zhang Xiaoxiang"); System.out.println (s1.getName ()); S.getInfo (); s1.getInfo (); if (s == s1) {System.out.println ("La même instance a été créée"); } else if (s! = s1) {System.out.println ("Création pas la même instance"); } else {System.out.println ("Erreur d'application"); }}}}Résultats en cours:
Zhang Xiaoxiang Zhang Xiaoxiang
Message de sortie Zhang Xiaoxiang
Message de sortie Zhang Xiaoxiang a créé la même instance
Conclusion: D'après les résultats, nous pouvons voir que le modèle Singleton fournit une application orientée objet avec le point d'accès unique pour un objet. Quelle que soit la fonction qu'il implémente, toute l'application partagera un objet d'instance.
1. Singleton affamé
// classe singleton affamée. Lorsque l'initialisation de la classe, la classe publique Singleton1 a été instanciée elle-même {// Constructeur par défaut privé Singleton1 () {} // Ajouter un singleton final statique privé Singleon1 single = new Singleton1 (); // Méthode d'usine statique publique statique singleton1 getInstance () {return single; }} 2. Classe de singleton paresseux
// Classe de singleton laggy. Instanciate public class singleton2 Lorsque vous appelez la première classe publique Singleton2 {// Constructeur par défaut privé Singleton2 privé () {} // Notez qu'il n'y a pas de singleton statique privé final final single = null; // Méthode d'usine statique publique synchronisée statique Singleton2 getInstance () {if (single == null) {single = new singleton2 (); } return single; }} 3. Classe singleton enregistrée
import java.util.hashmap; importation java.util.map; // classe singleton enregistrée. // Similaire à la méthode de Spring, enregistrez le nom de classe et tirez-le directement à partir de celui-ci la prochaine fois. classe publique singleton3 {carte statique privée <chaîne, singleton3> map = new hashmap <string, singleton3> (); statique {singleton3 single = new singleton3 (); map.put (single.getClass (). getName (), single); } // Le constructeur par défaut protégé Singleton3 () {} // Méthode d'usine statique, renvoie l'instance unique de cette classe publique statique singleton3 getInstance (String name) {if (name == null) {name = singleton3.class.getName (); System.out.println ("name == null" + "---> name =" + name); } if (map.get (name) == null) {try {map.put (name, (singleton3) class.forname (name) .newinstance ()); } catch (InstantiationException e) {e.printStackTrace (); } catch (illégalaccessException e) {e.printStackTrace (); } catch (classNotFoundException e) {e.printStackTrace (); }} return map.get (name); } // Une méthode commerciale schématique String public sur () {return "Bonjour, je suis Regsingleton."; } public static void main (String [] args) {singleton3 single3 = singleton3.getInstance (null); System.out.println (single3.about ()); }} Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.