El patrón de doble verificación se menciona en el artículo 48 del libro Efective Java, y se señala que este patrón generalmente no es aplicable en Java. La estructura de este patrón es la siguiente:
Public Resource getResource () {if (resource == null) {sincronizado (this) {if (resource == null) {resource = new Resource (); }}} recurso de retorno; }Este patrón es una mejora en el siguiente código:
Public sincronizado Resource getResource () {if (resource == null) {resource = new Resource (); } recurso de retorno; }El propósito de este código es retrasar la inicialización del recurso. Pero cada vez que accede a él, debe sincronizarse. Para reducir la sobrecarga de la sincronización, está disponible un modo de verificación doble.
La razón por la cual el modo de verificación doble no es válido en Java es que el tipo de referencia no es seguro de subprocesos en ausencia de sincronización. Para tipos básicos, excepto el modo largo y doble, doble y doble verificación, es aplicable. Por ejemplo, el siguiente código es correcto:
privado int count; public int getCount () {if (count == 0) {sincronizado (this) {if (count == 0) {count = Computecount (); // un cálculo de tiempo en el tiempo}}} return Count; }Lo anterior es la conclusión general sobre el idioma de doble verificación en Java. Pero las cosas aún no han terminado, porque el patrón de memoria de Java también se está mejorando. Doug Lea escribió en su artículo: "Según el último modelo de memoria JSR133 Java, si el tipo de referencia se declara como volátil, el modo de verificación doble funcionará". Entonces, en el futuro, debe usar el modo de verificación doble en Java, puede usar el siguiente código:
Recurso privado de recursos volátiles; Public Resource getResource () {if (resource == null) {sincronizado (this) {if (resource == null) {resource = new Resource (); }}} recurso de retorno; }Por supuesto, debe estar en Java que sigue a la especificación JSR133.
Por lo tanto, la doble verificación no está disponible en versiones J2SE 1.4 o anteriores debido a las escrituras fuera de orden al sintonizar en múltiples subprocesos o JVM. Este problema se ha solucionado en J2SE 5.0, y la palabra clave volátil se puede utilizar para garantizar que los singletons bajo múltiples subconjuntos.
clase pública Singleton {private volátil singleton instancia = nulo; public singleton getInStance () {if (instance == null) {sincronizado (this) {if (instance == null) {instancia = nuevo singleton (); }} instancia de retorno; }}El método recomendado es el titular de inicialización de la demanda (IODH).
public class Singleton {static class singletonholder {static singleton instance = new Singleton (); } public static singleton getInstance () {return Singletonholder.instance; }}Lo anterior se trata de este artículo, espero que sea útil para todos aprender la programación de Java.