¿Cuál es el principio de implementación de ThreadLocal y cuáles son los tipos de referencia y escenarios de uso?
Para un objeto ThreadLocal, generalmente hay dos referencias que apuntan a él:
La clave es una referencia débil y se reciclará automáticamente cuando no haya una referencia fuerte externa. El valor es una referencia sólida y la cadena de referencia es la siguiente
Por lo tanto, el valor se reciclará solo cuando se recicle el hilo; de lo contrario, el valor siempre existirá, pero no es realista cerrar cada hilo. En un grupo de subprocesos, la mayoría de los subprocesos acompañarán todo el ciclo del sistema, por lo que el valor puede provocar fugas.
La solución es limpiar ThreadLocalMap al ejecutar set(), get() y remove():
Lo que realmente recicla el valor es el método expungeStaleEntry() en remove. Este método se llamará tanto en el método como en el set.
Para evitar pérdidas de memoria, ThreadLocal no solo utiliza referencias débiles para mantener la clave, sino que también verifica si la clave se ha reciclado en cada operación y luego recicla el valor.
1. Referencia fuerte
2. Referencia suave
3. Referencia débil
4. Referencia virtual