1. 程式人生 > >ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去

ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去

最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個執行緒中值串來串去,排查一番,確定問題為執行緒池的問題,執行緒池中的執行緒是會重複利用的,而ThreadLocal是用執行緒來做Key的所以在使用執行緒池的時候要特別注意ThreadLocal.
ThreadLocal資料是線上程建立時繫結線上程上的, 所以解決方法是在使用資料之前呼叫remove() 移除掉之前的其他執行緒產生的資料

解決方法

重構remove方法
@Override
public void remove() {
super.remove();
initialValue();
}
先remove, 然後再初始化一次, 這樣就可以保證資料是乾淨的了.

當然你也可以在呼叫的finally裡面使用remove, 也是可以的.