解決ThreadLocal中記憶體洩漏和資料丟失問題

2021-10-22 14:02:14 字數 891 閱讀 2057

這裡需要注意一點的是:

我們知道,在使用threadlocal時候,我們肯定要先new出它,如下:

public

static

void

main

(string[

] args)

throws interruptedexception

public

static

void

tl1(threadlocal

threadlocal)

public

static

void

tl2(threadlocal

threadlocal)

其實我們存進去後,在別的地方拿出來,這個強引用new是乙隻存在的

所以,這個時間範圍內,threadlocal是不會被**的

當我們使用**,解除強引用後:

threadlocal = null;
當發生gc的時候,threadlocal會指向的物件會被**,即使執行緒裡面的弱引用指向那個new的obj也沒有用

但是,從實際場景來說,我們自己解除了強引用,後面肯定是沒辦法通過它來呼叫get方法獲取值了。

實際上,不存在業務上的資料丟失。

但是,如果我們寫了 threadlocal = null; **,那麼會導致記憶體洩露

gc的時候,會帶走我們new 的threadlocal 物件,但是,它的value沒被帶走

所以,導致了記憶體洩露

所以,當我們不需要這個threadlocal 的時候,要主動釋放資源,呼叫remove方法,

把它從執行緒記憶體中剔除

當然,執行緒自身終止,也可以清楚執行緒內部的threadlocal變數

ThreadLocal 執行緒內取不到值

threadlocal 執行緒內取不到值 在 裡,從 request 請求裡拿出了一些資料例如使用者id啥的,儲存到了 threadlocal 裡,在後面具體的業務處理中,從 threadlocal 卻裡取不到值 大概率是因為當前業務執行緒和之前 不是同一執行緒,可以使用一下方法檢視一下執行緒 id...

執行緒範圍內共享資料ThreadLocal

原始碼 private t setinitialvalue 1 原始版本 public class threadlocaltestbefore start new thread new runnable start a b類分別為使用執行緒區域性變數的資料 static class a static...

ThreadLocal在Spring中的應用

在jdk中有乙個實現多執行緒的類,叫threadloacal,在提及spring事務管理時也經常被人說到。下面就和大家一起分享下它的神通廣大 上原始碼,public t get return setinitialvalue 通過原始碼可以看出,在threadlocal中維護了乙個map,用於儲存每乙...