Resolva o problema de vazamento de memória e perda de dados em ThreadLocal

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

Acho que você gosta

Origin blog.csdn.net/Brave_heart4pzj/article/details/114983497
Recomendado
Clasificación