Lors de l'écriture de logiciels, vous devez souvent utiliser une fonction de journal d'impression, ce qui peut vous aider à déboguer et à positionner le problème après le lancement du projet, il peut également vous aider à analyser les données. Mais la méthode native System.out.println () de Java est rarement utilisée dans le développement de projets réels, et même les outils de vérification de code tels que FindBugs penseront que l'utilisation de System.out.println () est un bogue.
Pourquoi System.out.println (), qui est un artefact novice de Java, sera rejeté dans le développement réel de projet? En fait, tant que vous l'analysez attentivement, vous en trouverez de nombreux inconvénients. Par exemple, si elle n'est pas contrôlée, tous les journaux seront imprimés comme d'habitude après le lancement du projet, réduisant ainsi l'efficacité de fonctionnement; ou il ne peut pas enregistrer le journal au fichier local. vous pour distinguer la catégorie que ce journal est imprimé.
Votre chef n'est pas un idiot. Cependant, votre leader est assez bon, et il ne vous permet pas d'obtenir un outil de journal Niubi avec diverses fonctions au début.
Cette demande n'est pas difficile pour vous.
Classe publique Logutil {public final dans Debug = 0; System.out.println (msg);}} public void info (String msg) {if (info> = niveau) {System.out.println (msg);} public void ing Msg) {if (error> = niveau) {System.out.println (msg);}}}
Imprimez le journal via cette classe et ne devez contrôler que le niveau du niveau pour contrôler librement le contenu d'impression. Par exemple, le projet est désormais au stade de développement et le niveau est fixé pour déboguer, afin que toutes les informations du journal soient imprimées. Si le projet est en ligne, vous pouvez définir le niveau sur les informations, afin que vous ne puissiez voir que le journal et l'impression du journal de niveau ci-dessus. Si vous voulez simplement voir le mauvais journal, vous pouvez définir le niveau sur l'erreur. Et si le projet que vous développez est une version client, vous ne souhaitez imprimer aucun journal, vous pouvez définir le niveau sur rien. Vous n'avez qu'à appeler lors de l'impression:
New Logutil ().
Vous avez hâte de présenter cet outil à votre chef.
Mais il n'a pas fallu longtemps à votre chef pour vous trouver pour donner des commentaires. Il a dit que cet outil est facile à utiliser, il ne fait pas de distinction entre l'impression de telles choses. pour l'utiliser pour l'utiliser.
Pensez-vous que votre chef est très raisonnable, et vous essayez de profiter de cette occasion pour pratiquer le mode de conception, vous avez donc écrit le code suivant (PS: Le code ici est fait par moi-même, et je n'ai pas fait attention aux It. Je n'y ai pas fait attention.
Classe publique Logutil {Private Static Logutil Logutilinstance; GetInstance () {if (logutilinstance == null) {logutilinstance = new Logutil ();} return Logutilinstance;} public void debug (String g. {If (debug> = niveau) {System.out.println (msg);} } Public void info (String msg) {if (info> = niveau) {System.out.println (msg);} public void error (String msg) {if (error> = niveau) {System .out. );}} Public static void main (String [] args) {logutil.getInstance ().
Tout d'abord, le constructeur de Logutil est privatisé, de sorte que le nouveau mot-clé ne peut pas être utilisé pour créer une instance Logutil. Ensuite, utilisez une variable statique privée slogutil pour enregistrer l'instance et fournir une méthode de GetInstance publique pour obtenir une instance logutil. slogutil directement. Cela peut garantir qu'il n'y aura qu'une instance de logutil dans la mémoire. Le mode unique est terminé! À l'heure actuelle, le code du journal d'impression doit être modifié à la manière suivante:
Logutil.getInstance ().
Vous montrez cette version à votre chef.
Vous êtes plein de suspicion, le mode d'exemple unique n'est-il pas réalisé comme ça? Que peut être un bug?
Votre leader vous invite que l'utilisation d'un mode simple consiste à faire que cette classe n'a qu'une seule instance en mémoire, mais considérez-vous la situation d'impression des journaux en multi-thread? Comme indiqué dans le code suivant:
Public static logutil getInstance () {if (logutilinstance == null) {logutilinstance = new logutil ();} return logutilinstance;}
S'il y a deux threads en même temps exécutant la méthode GetInstance en même temps, le premier thread exécute simplement la deuxième ligne et n'a pas encore exécuté la troisième ligne. De cette façon, votre mode simple échoue car deux instances différentes sont créées.
Vous réalisez soudainement, mais votre réflexion est très rapide, et vous pensez immédiatement à la solution.
Public synchronisé statique logutil getInstance () {if (logutilinstance == null) {logutilinstance = new Logutil ();} return Logutilinstance;}
De cette façon, un seul thread est autorisé à exécuter le code dans GetInstance en même temps, ce qui résout efficacement la situation où les deux instances créeront ci-dessus.
Votre chef lit votre nouveau code et a dit: "Eh bien, oui. Cela résout la situation qui peut créer deux instances, mais ce code est toujours un problème."
Vous êtes nerveux, pourquoi y a-t-il des problèmes?
Votre chef a souri: "Ne soyez pas nerveux, cette fois, ce n'est pas un bug, mais il peut être optimisé en termes de performances. Regardez, si vous ajoutez une méthode synchronisée à la méthode GetInstance, alors je vais à la GetInstace Méthode, je serai synchronisé.
Supprimez d'abord le mot-clé synchronisé de l'instruction Méthode et ajoutez-le au corps de la méthode:
Public static logutil getInstance () {if (logutilinstance == null) {synchronisé (logutil.class) {if (logutilinstance == null) {// il peut être nécessaire car les deux processus peuvent être joints en même temps au même temps le temps en même temps.
Une fois le code modifié à cela, il entrera la troisième ligne lorsque le slogutil n'est pas initialisé, puis ajoutera le verrou synchrone. Dès que la slogutil est initialisée, elle n'ira plus à la troisième ligne, de sorte que la méthode GetInstance ne sera pas affectée par les serrures de synchronisation, et l'efficacité sera améliorée dans une certaine mesure.
Vous ne pouvez pas vous empêcher d'admirer. Cette méthode est vraiment intelligente.
Votre chef est immédiatement devenu humble: "Cette méthode est appelée verrouillage à double vérification, mais je n'y pense pas. Vous pouvez vérifier plus d'informations sur Internet."
En fait, je suis plus habitué à utiliser le mode Hungry Man en Java
La caractéristique du style paresseux est un chargement retardé.
La caractéristique du style affamé Han est qu'elle est chargée au début, vous pouvez donc revenir directement lorsque vous l'utilisez (je recommande celle-ci, car il n'est pas nécessaire de considérer trop de problèmes de sécurité de threads. Bien sûr, les serrures doubles mentionné pour résoudre le problème de synchronisation)
Le code d'implémentation des enregistrements de journal avec le style Hungry Han est le suivant:
Classe publique Logutil {Private Static Final Logutilinstance = New Logutil (); () {} Public static logutil getInstance () {return logutilinstance;} public void debug (String msg) {if (debug> = niveau) {System.out.print ln (msg);}} public void info (String msg) {if (info> = level) {System.out.println (msg);}} public void error (String msg) {if (error> = niveau) {System.out.println (msg);} public atic void main (String [] Art) {Logutil.getInstance ().