Prefacio
Este artículo trata de explorar referencias débiles en Java desde las perspectivas de qué, por qué y cómo ayudar a todos a comprender las definiciones, escenarios de uso básicos y métodos de uso de referencias débiles en Java.
1. ¿Qué? ¿Qué es una cita débil?
Las referencias débiles en Java se refieren específicamente a java.lang.ref.WeakReference<T> . Veamos primero la documentación oficial lo explica:
La existencia de un objeto de referencia débil no evita que el objeto que apunte sea reciclado por el recolector de basura. El uso más común de referencias débiles es implementar mapeos de canonicización (como las tablas hash).
Suponiendo que el recolector de basura decide que un objeto es débilmente accesible en un cierto punto en el tiempo (es decir, todos los puntos actuales son referencias débiles), el recolector de basura despejará todas las referencias débiles al objeto, y luego marcará el objeto accesible débil como finalizable, para que se reciclará más tarde. Al mismo tiempo o posterior, el recolector de basura colocará las referencias débiles recién despejadas en la cola de referencia especificada al crear el objeto de referencia débil.
De hecho, hay cuatro tipos de referencias en Java, que son de fuertes a débiles: referencia fuerte , referencia suave , referencia débil y referencia virtual .
A continuación presentamos brevemente otras tres citas además de citas débiles:
1. Referencia fuerte: Por lo general, la referencia que devolvemos cuando creamos un nuevo objeto a través de nuevo es una referencia fuerte. Si se puede alcanzar un objeto a través de una serie de referencias fuertes, es muy accesible, entonces no se reciclará.
2. Referencia suave: la diferencia entre la referencia suave y la referencia débil es que si un objeto es accesible por una referencia débil, se reciclará independientemente de si la memoria actual es suficiente, mientras que el objeto accesible por una referencia suave solo se reciclará cuando la memoria sea insuficiente. Por lo tanto, las referencias suaves son "más fuertes" que las referencias débiles.
3. Referencia fantasma: la referencia virtual es la referencia más débil en Java, entonces, ¿qué tan débil es? Es tan frágil que ni siquiera podemos obtener el objeto referenciado a través de referencias virtuales. El único propósito de las referencias virtuales es que cuando el objeto al que señala se recicla, la referencia virtual en sí se agregará a la cola de referencia y se usa para registrar que el objeto al que señala ha sido reciclado.
2. ¿Por qué-por qué usar referencias débiles?
Considere el siguiente escenario: ahora hay una clase Product que representa un producto, que está diseñado para no ser escalable, y en este momento queremos agregar un número a cada producto. Una solución es usar HashMap<Product, Integer> . Entonces viene el problema. Si ya no necesitamos que exista un objeto Product en la memoria (por ejemplo, este producto se ha vendido), suponiendo que la referencia a él sea productA , asignaremos un valor a productA como null . Sin embargo, en este momento, el objeto Product señalado por productA en el pasado no se reciclará, porque obviamente está referenciado por HashMap . Entonces, en este caso, si realmente queremos reciclar un objeto Product , no es suficiente simplemente asignar su fuerte referencia a null , y también necesitamos eliminar la entrada correspondiente del HashMap . Obviamente, no queremos completar el trabajo de "eliminar las entradas no necesarias de HashMap " por nosotros mismos. Queremos decirle al recolector de basura: solo key en HashMap hace referencia Product , el objeto Product correspondiente se puede reciclar. Obviamente, según la definición anterior de citas débiles, el uso de citas débiles puede ayudarnos a lograr este objetivo. Solo necesitamos usar un objeto de referencia débil que apunte al objeto Product como key en HashMap .
3. Cómo, ¿cómo usar referencias débiles?
Tome el escenario introducido anteriormente como ejemplo. Utilizamos un objeto de referencia débil que apunta al objeto Product como key de HashMap , y simplemente definimos este objeto de referencia débil como este:
Producto productA = nuevo producto (...); débilreference <product> débilproductA = new WeakReference <> (productA);
Ahora, si se hace referencia al objeto weakProductA , apunta al objeto Product productA . Entonces, ¿cómo obtenemos Product productA al que señala a través weakProduct ?
Es muy simple, solo necesito el siguiente código:
Producto Producto = WeakProductA.get ();
De hecho, para este caso, la Biblioteca de Class Java nos proporciona la clase WeakHashMap . Usando esta clase, su clave es naturalmente un objeto de referencia débil, y ya no necesitamos envolver manualmente el objeto original. De esta manera, cuando productA se vuelve null (indica que Product al que hace referencia ya no necesita existir en la memoria), Product objeto de referencia débil es weakProductA , entonces obviamente el objeto Product correspondiente es débil y se puede alcanzar en este momento, por lo que la referencia débil que apunta a él se borrará, y el objeto Product se reciclará, y la referencia débil se apunta a que ingresará la referencia de referencia.
4. Cola de referencia
Presentemos brevemente el concepto de citar colas. De hecho, la clase WeakReference tiene dos constructores:
// Crear una referencia débil a la referencia de objeto dado (referencia t) // Cree una referencia débil al objeto dado y registra una referencia débil a la referencia de referencia dada débil (re referencia, referencequeue <? Super t> q)
Podemos ver que el segundo constructor proporciona un parámetro de ReferenceQueue de tipo. Al proporcionar este parámetro, registramos el objeto de referencia débil creado en una cola de referencia. De esta manera, cuando el recolector de basura lo borra, se enviará a la cola de referencia, y podemos administrar estos objetos de referencia débiles limpios de manera unificada.
5. Resumen
Bueno, el contenido de este artículo termina aquí. Debido al nivel personal limitado, hay aspectos inevitablemente inexactos o poco claros en la narrativa. Espero que puedas señalarlo, gracias por tu apoyo a Wulin.com.