ThreadLocalでのメモリリークとデータ損失の問題を解決します

https://blog.csdn.net/qunqunstyle99/article/details/94717256

ここで注意すべきことの1つは次のとおりです。

ThreadLocalを使用するときは、最初に次のように新しいスレッドローカルを作成する必要があることがわかっています。

    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());
    }

実際、保存して他の場所に取り出した後、この新しいものへの強い参照が存在します。
したがって、この時間範囲内では、ThreadLocalはリサイクルされません。

コードを使用する場合、強力な参照を削除した後:

threadLocal = null;

GCが発生すると、threadLocalが指すオブジェクトがリサイクルされます。スレッド内の弱い参照が新しいオブジェクトを指している場合でも、それは役に立ちません。

ただし、実際のシナリオから、強い参照を自分で削除したため、後でgetメソッドを呼び出して値を取得する方法はありません。

実際、ビジネスデータの損失はありません。

ただし、threadLocal = null;コードを記述すると
、GCが新しいThreadLocalオブジェクトを削除するときにメモリリークが発生しますが、その値は取得されていない
ため、メモリリークが発生します。

したがって、このThreadLocalが必要ない場合は、リソースをアクティブに解放し、removeメソッドを呼び出して
、スレッドメモリから削除する必要があります。

もちろん、スレッド自体が終了した場合、スレッド内のThreadLocal変数もクリアできます。

おすすめ

転載: blog.csdn.net/Brave_heart4pzj/article/details/114983497