La implementación del patrón Java Singleton se ha resuelto varios métodos de implementación del patrón Java Singleton:
Esto es cuántos libros escriben:
public class Singleton1 {private singleton1 () {} private static singleton1 instancia = null; public static singleton1 getInstance () {if (instance == null) {instancia = new Singleton1 (); } instancia de retorno; }}Sin embargo, esto no está escrito en el desarrollo real, porque hay un problema grave: cuando se accede a un acceso concurrente múltiple, ¡se pueden generar múltiples instancias! !
Aquí hay algunos métodos de uso común:
1. Use palabras clave sincronizadas
paquete singleton; public class Singleton1 {private singleton1 () {} private static singleton1 instancia = null; // Solución 1 del problema de subprocesos múltiples, ¡pero no es eficiente! ¡Porque cada llamada estará bloqueada! public static sincronizado sincronizado1 getInstance () {if (instance == null) {instancia = new Singleton1 (); } instancia de retorno; } public void print () {System.out.println ("Thread_id:"+Thread.CurrentThread (). GetId ()); } objeto estático privado objeto = nuevo objeto (); // Un método muy inteligente, solo cuando se agrega NULL, no hay público static singleton1 getInstance2 () {if (instance == null) {sincronizado (objeto) {instancia = nuevo singleton1 (); }} instancia de retorno; }} 2. Agregar bloqueo
paquete singleton; import java.util.concurrent.locks.reentrantlock; public class Singleton2 {private Singleton2 () {} private static reentrantlock Lock = new ReentrantLock (); Instancia privada estática Singleton2 = NULL; public void print () {System.out.println ("Thread_id:"+Thread.CurrentThread (). GetId ()); } public static singleton2 getInStance2 () {if (instance == null) {lock.lock (); if (instancia == null) {// ¡Tenga en cuenta que hay otro juicio aquí! ! instancia = new Singleton2 (); } Lock.unlock (); } instancia de retorno; }} 3. Use variables estáticas:
paquete singleton; public class Singleton3 {public static void print () {System.out.println ("Thread_id:"+Thread.CurrentThread (). GetId ()); } public static nested getNested () {return nested.instance; } // Esta es una clase creada por una clase estática singleton anidada {private Nested () {} instancia anidada estática = new Nested (); }}Lo anterior es el patrón de creación singleton comúnmente utilizado:
Código de prueba de prueba:
paquete singleton; importación singleton.singleton3.nested; public class test2 {public static void main (string [] args) {// todo método generado automático stub singleton; Myrunnable mm = new Myrunnable (); Myrunnable m1 = new Myrunnable (); Myrunnable2 m2 = new Myrunnable2 (); nuevo hilo (m1) .Start (); nuevo hilo (m2) .Start (); if (m1.singleton == m2.singleton) {// es el mismo sistema.out.println ("es el mismo"); } else {System.out.println ("no es el mismo"); }}} class Myrunnable implementos runnable {Nested Singleton; @Override public void run () {// TODO Auto Generated Method stub Singleton = Singleton3.getNested (); Singleton3.print (); }} clase MyRUNNable2 implementa Runnable {Nested Singleton; @Override public void run () {// TODO Auto Generated Method stub Singleton = Singleton3.getNested (); Singleton3.print (); }}Producción:
Es lo mismo
Thread_id: 11
Thread_id: 10
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!