ThreadLocal存List遇到的坑

2022-03-26 05:27:25 字數 990 閱讀 3187

之前為了方便乙個service下共用list,將list作為類成員變數,當然有點執行緒安全意識的兄弟們都知道不能就這麼直接加在上面。

1

public

class

permservice

當然用鎖(synchronized)又還不至於,於是這裡用了執行緒本地變數threadlocal,如下:

1

public

class

permservice 8};

9....

10 }

然後我每次請求進來之後都是類似於這麼處理的

1

public

void

storepermsbyrole(string roleid)

後面用postman測的時候問題來了:原本和這個roleid沒有關係的permid在返回體裡面出現了,查了下庫裡面也沒有這兩個關係的記錄,debug斷點打到上面的第3行permids裡面也沒有那一條資料,那麼這多出來的一條是哪來的呢?

苦思冥想意識到可能和執行緒池有關係(這裡說的執行緒池不是你配的全域性執行緒池,也不是手動用executors生成的執行緒池),所有執行緒池一般有個核心執行緒數,這些執行緒是不會在乙個請求request結束後就銷毀的,而執行緒本地變數又是依附於執行緒的(具體可以理解下threadlocalmap),所以乙個執行緒上乙個請求將資料庫中查出來的list加到執行緒本地變數後,下乙個請求進來原來的list還在裡面,從而導致了上面的問題。

這裡解決方法是在service中加一段清空threadlocal的邏輯,在請求結束之前調一下即可。

1

public

void

clearthreadlocal()

threadlocal用的守則:

1、請求開始時set

2、請求結束前remove

3、加static關鍵字

C Redis存Session Hash存物件

1.新建乙個控制台程式,並新建乙個類 userinfo 啟動後出現dos介面,因為沒有設定配置檔案,所以會使用預設設定,像這樣 3.現在轉回visual studio 對著專案的新增引用從nuget 安裝後,就可以開始我們的 了 4.我們有乙個userinfo類,裡面有2個屬性int id和stri...

ThreadLocal個人理解

為了加深理解,將最近對threadlocal的了解和原始碼分析記錄總結一下。threadlocal可以為執行緒提供區域性變數。使用threadlocal的get 方法,可以在當前執行緒能夠訪問的類和方法中,得與當前執行緒相關聯的變數值。不過,執行緒區域性變數並不是由threadlocal物件儲存維護...

ThreadLocal 及其機制

一 threadlocal類的例子 某一線程中的區域性變數會被其他執行緒所改寫,所以有了threadlocal類,可以用這個類來儲存區域性變數,以保證區域性變數的安全!以下兩個例子其中之一使用了threadlocal類,另乙個未用,注意觀察其結果的不同 class unsafetask implem...