Al escribir software, a menudo debe usar una función de registro de impresión, que puede ayudarlo a depurar y posicionar el problema. Pero el método nativo de Java System.out.println () rara vez se usa en el desarrollo real de proyectos, e incluso las herramientas de comprobación de código como FindBugs pensarán que usar System.out.println () es un error.
¿Por qué System.out.println (), que es un artefacto novato de Java, se rechazará en el desarrollo real del proyecto? De hecho, siempre que lo analice con cuidado, encontrará muchas desventajas de ello. Por ejemplo, si no está controlado, todos los registros se imprimirán como de costumbre después de que se lance el proyecto, reduciendo así la eficiencia operativa; Usted para distinguir en qué categoría se imprime este registro.
Su líder no es un tonto. Sin embargo, su líder es bastante bueno y no le permite lograr una herramienta de registro de Niubi con varias funciones al principio.
Esta demanda no es difícil para usted.
Public Class Logutil {Public Final en Debug = 0; system.out.println (msg);}} public void info (string msg) {if (info> = nivel) {system.out.println (msg);} public void msg) {if (error> = nivel) {System.out.println (msg);}}}
Imprima el registro a través de esta clase y solo necesita controlar el nivel del nivel para controlar libremente el contenido de impresión. Por ejemplo, el proyecto ahora está en la etapa de desarrollo, y el nivel está listo para depurar, de modo que se imprima toda la información del registro. Si el proyecto está en línea, puede establecer el nivel en información, para que solo pueda ver el registro y la impresión de registro de nivel anterior. Si solo desea ver el registro incorrecto, puede establecer el nivel en error. Y si el proyecto que desarrolla es una versión del cliente, no desea imprimir ningún registro, puede establecer el nivel en nada. Solo necesita llamar al imprimir:
nuevo logutil ().
No puede esperar para presentar esta herramienta a su líder.
Pero a su líder no le pasó mucho tiempo encontrarle comentarios. Dijo que aunque esta herramienta es fácil de usar, no distingue entre tales cosas. para usarlo para usarlo.
¿Crees que tu líder es muy razonable, y estás tratando de aprovechar esta oportunidad para practicar el modo de diseño? It.
Public Class Logutil {Logutil Static LogutilIntance; GetInStance () {if (logutIlInStance == null) {logutilInStance = new LogUtil ();} return LogutIlInStance;} public void Debug (String g. {If (debug> = nivel) {System.out.println (msg);} } Public void info (String msg) {if (info> = nivel) {system.out.println (msg);} public void error (string msg) {if (error> = nivel) {system .out. );}} Public static void main (string [] args) {logutil.getInstance ().
En primer lugar, el constructor de logutil se privatiza, de modo que la nueva palabra clave no se puede usar para crear una instancia de logutil. Luego use una variable estática privada de slogutil para guardar la instancia y proporcionar un método público de getInstance para obtener una instancia de logutil. Slogutil directamente. Esto puede garantizar que solo habrá una instancia de logutil en la memoria. ¡Se completa el modo único! En este momento, el código del registro de impresión debe cambiarse de la siguiente manera:
Logutil.getInstance ().
Muestras esta versión a tu líder.
Estás lleno de sospechas, ¿no se realiza el modo de ejemplo único así? ¿Qué puede ser un error?
Su líder le indica que usar un modo de solteros es hacer que esta clase solo tenga una instancia en la memoria, pero ¿considera la situación de imprimir registros en múltiples hilos? Como se muestra en el siguiente código:
Public static logutil getInStance () {if (logutIlInstance == null) {logutIlInStance = new LogUtil ();} return LogutIlInstance;}
Si hay dos hilos al mismo tiempo que ejecutan el método GetInstance al mismo tiempo, el primer hilo solo ejecuta la segunda línea y aún no ha ejecutado la tercera línea. De esta manera, su modo de solteros falla porque se crean dos instancias diferentes.
De repente te das cuenta, pero tu pensamiento es muy rápido, e inmediatamente piensa en la solución.
Public sincronizado logutil getInStance () {if (logutIlInstance == null) {logutilInStance = new LogUtil ();} return LogutIlInstance;}
De esta manera, solo se permite que un hilo ejecute el código en GetInstance al mismo tiempo, lo que resuelve efectivamente la situación en la que las dos instancias crearán anteriormente.
Su líder lee su nuevo código y dijo: "Bueno, sí. Esto resuelve la situación que puede crear dos instancias, pero este código sigue siendo un problema".
Estás nervioso, ¿por qué hay algún problema?
Su líder sonrió: "No te pongas nervioso, esta vez no es un error, pero se puede optimizar en términos de rendimiento. Mira, si agrega un método sincronizado al método GetInstance, entonces cada vez que voy a GetInstace Método, estaré sincronizado.
Primero elimine la palabra clave sincronizada de la instrucción de método y agréguela al cuerpo del método:
Public static logutil getInStance () {if (logutilinstance == null) {sincronizado (logutil.class) {if (logutilinstance == null) {// puede ser necesario porque los dos procesos pueden conectarse al mismo tiempo al mismo tiempo en el mismo tiempo tiempo al mismo tiempo.
Después de que el código se cambie a esto, ingresará a la tercera línea cuando no se inicialice el slogutilo y luego agregue el bloqueo sincrónico. Tan pronto como se inicialice el slogutilo, ya no irá a la tercera línea, por lo que el método GetInstance no se verá afectado por los bloqueos de sincronización, y la eficiencia mejorará en cierta medida.
No puedes evitar admirar.
Su líder inmediatamente se volvió humilde: "Este método se llama bloqueo de doble verificación, pero no pienso en ello. Puede verificar más información en Internet".
De hecho, estoy más acostumbrado a usar el modo Hungry Man en Java
La característica del estilo perezoso es la carga retrasada.
La característica del estilo han hambriento es que está cargado al principio, por lo que puede regresar directamente cuando lo usa (recomiendo este más, porque no hay necesidad de considerar demasiados problemas de seguridad de hilos. Por supuesto, las cerraduras duales mencionado para resolver el problema de sincronización)
El código de implementación de registros de registro con hambriento estilo Han es el siguiente:
Public Class Logutil {Private Static Final Logutilinstance = New Logutil (); () {} Public static logutil getInStance () {return logutIlInStance;} public void Debug (String Msg) {if (debug> = nivel) {System.out.print ln (msg);}} public INFO Void (String Msg) {if (info> = nivel) {System.out.println (msg);}} Error de publicidad public (String msg) {if (error> = nivel) {system.out.println (msg);} public atic void main main (String [] art) {logutil.getInstance ().