https://blog.csdn.net/qunqunstyle99/article/details/94717256
Uma coisa a se observar aqui é:
Sabemos que, ao usar ThreadLocal, devemos primeiro alterá-lo, da seguinte maneira:
public static void main(String[] args) throws InterruptedException {
ThreadLocal<String> threadLocal= new ThreadLocal();
tl1(threadLocal);
Thread.sleep(1000);
tl2(threadLocal);
}
public static void tl1(ThreadLocal<String> threadLocal){
threadLocal.set("xx");
}
public static void tl2(ThreadLocal<String> threadLocal){
System.out.println(threadLocal.get());
}
Na verdade, depois de salvá-lo e retirá-lo de outro lugar, essa forte referência ao novo existe.Portanto
, dentro desse intervalo de tempo, ThreadLocal não será reciclado.
Quando usamos o código, depois de remover a referência forte:
threadLocal = null;
Quando ocorre GC, o objeto apontado por threadLocal será reciclado, mesmo se a referência fraca no thread apontar para o novo obj, é inútil
No entanto, do cenário real, removemos a referência forte nós mesmos e não deve haver nenhuma maneira de chamar o método get para obter o valor por meio dele mais tarde.
Na verdade, não há perda de dados de negócios.
No entanto, se escrevermos o código threadLocal = null ;, ocorrerá um vazamento de memória
quando o GC retirar nosso novo objeto ThreadLocal, mas seu valor não foi removido.
Portanto, isso leva a um vazamento de memória.
Portanto, quando não precisamos deste ThreadLocal, devemos liberar ativamente o recurso, chamar o método
remove e removê-lo da memória do thread
Claro, se o thread em si termina, a variável ThreadLocal dentro do thread também pode ser limpa