Plusieurs façons de mettre en œuvre le modèle Java Singleton
C'est combien de livres écrivent:
classe publique singleton1 {private singleton1 () {} instance statique privée singleton1 = null; public static singleton1 getInstance () {if (instance == null) {instance = new singleton1 (); } return instance; }}Cependant, cela n'est pas écrit dans le développement réel, car il y a un problème grave: lorsque l'accès simultané multi-thread est accessible, plusieurs instances peuvent être générées! !
Voici quelques méthodes couramment utilisées:
1. Utilisez des mots clés synchronisés
package singleton; classe publique singleton1 {private singleton1 () {} instance statique privée singleton1 = null; // Solution 1 du problème multi-threading, mais ce n'est pas efficace! Parce que chaque appel sera verrouillé! public static synchronisé singleton1 getInstance () {if (instance == null) {instance = new singleton1 (); } return instance; } public void print () {System.out.println ("thread_id:" + thread.currentThread (). getID ()); } objet statique privé objet = nouveau objet (); // une méthode très intelligente, uniquement lorsque Null est ajouté, pas de singleton statique publique GetInstance2 () {if (instance == null) {synchronisé (objet) {instance = new Singleton1 (); }} return instance; }} 2. Ajouter un verrouillage
package singleton; Importer java.util.concurrent.locks.rentrantlock; classe publique singleton2 {private singleton2 () {} private static reentrantlock lock = new reentrantLock (); instance privée statique singleton2 = null; public void print () {System.out.println ("thread_id:" + thread.currentThread (). getID ()); } public static singleton2 getInstance2 () {if (instance == null) {lock.lock (); if (instance == null) {// Notez qu'il y a un autre jugement ici! ! instance = new singleton2 (); } lock.unlock (); } return instance; }} 3. Utilisez des variables statiques:
package singleton; classe publique singleton3 {public static void print () {System.out.println ("thread_id:" + thread.currentThread (). getID ()); } public static nited genteted () {return nited.instance; } // Ceci est une classe créée par une classe statique singleton imbriquée {private nited () {} static nited instance = new nited (); }}Ce qui précède est le modèle de création de singleton couramment utilisé:
Code de test de test:
package singleton; Importer Singleton.Singleton3.Nessed; classe publique test2 {public static void main (String [] args) {// TODO Méthode générée automatique Stume imbriqué Singleton; Myrunnable mm = new myrunnable (); Myrunnable m1 = new myrunnable (); Myrunnable2 m2 = new myrunnable2 (); nouveau thread (m1) .start (); nouveau thread (m2) .start (); if (M1.Singleton == M2.Singleton) {// C'est le même System.out.println ("est le même"); } else {System.out.println ("n'est pas le même"); }}} classe MyRunnable implémente Runnable {nited singleton; @Override public void run () {// TODO Méthode générée automatique Stub Singleton = singleton3.getted (); Singleton3.print (); }} class Myrunnable2 implémente Runnable {nited singleton; @Override public void run () {// TODO Méthode générée automatique Stub Singleton = singleton3.getted (); Singleton3.print (); }}Sortir:
C'est la même chose
thread_id: 11
thread_id: 10
Ce qui précède est une compilation des informations du modèle Java Singleton. Nous continuerons d'ajouter des informations pertinentes à l'avenir. Merci pour votre soutien pour ce site Web!