1. 程式人生 > >ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去

ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去

解決 調用 遇到 方法 adl finall key 重復 remove

最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個線程中值串來串去,排查一番,確定問題為線程池的問題,線程池中的線程是會重復利用的,而ThreadLocal是用線程來做Key的所以在使用線程池的時候要特別註意ThreadLocal.
ThreadLocal數據是在線程創建時綁定在線程上的, 所以解決方法是在使用數據之前調用remove() 移除掉之前的其他線程產生的數據

解決方法

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

當然你也可以在調用的finally裏面使用remove, 也是可以的.

ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去