ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去
最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個執行緒中值串來串去,排查一番,確定問題為執行緒池的問題,執行緒池中的執行緒是會重複利用的,而ThreadLocal是用執行緒來做Key的所以在使用執行緒池的時候要特別注意ThreadLocal.
ThreadLocal資料是線上程建立時繫結線上程上的, 所以解決方法是在使用資料之前呼叫remove() 移除掉之前的其他執行緒產生的資料
解決方法
重構remove方法
@Override
public void remove() {
super.remove();
initialValue();
}
先remove, 然後再初始化一次, 這樣就可以保證資料是乾淨的了.
當然你也可以在呼叫的finally裡面使用remove, 也是可以的.
相關推薦
ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去
最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個執行緒中值串來串去,排查一番,確定問題為執行緒池的問題,執行緒池中的執行緒是會重複利用的,而ThreadLocal是用執行緒來做Key的所以在使用執行緒池的時候要特別注意ThreadL
ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去
解決 調用 遇到 方法 adl finall key 重復 remove 最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個線程中值串來串去,排查一番,確定問題為線程池的問題,線程池中的線程是會重復利用的,而ThreadLocal是用線程來做Ke
在使用執行緒池時應特別注意對ThreadLocal的使用
ThreadLocal可以為當前執行緒儲存區域性變數,而InheritableThreadLocal則可以在建立子執行緒的時候將父執行緒的區域性變數傳遞到子執行緒中。 如果使用了執行緒池(如Executor),那麼即使即使父執行緒已經結束,子執行緒依然存在並被池化。這樣,執
當面試官問執行緒池時,你應該知道些什麼?
Java面試中,執行緒池也算是一個高頻的問題,其實就JDK原始碼來看執行緒池這一塊的實現程式碼應該算是寫的清晰易懂的,通過這篇文章,我們就來盤點一下執行緒池的知識點。 本文基於JDK1.8原始碼進行分析 首先看下執行緒池建構函式: public ThreadP
使用執行緒池時讓所有執行緒都執行完再進行下一步
我們知道,當不使用執行緒池時,想讓A執行緒在B執行緒執行完之後執行,需要在A中的某個呼叫處,呼叫B.join,但如果使用jdk1.5以後提供的執行緒池ExecutorService,這個就用不上了,用了會出同步問題,其實這個場景應該是很常見的吧,比如你用多執行緒併發執
執行緒池中多執行緒設定超時退出監控
前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到
多執行緒池,批量執行多個任務(***實用總結***)
1 import java.util.Random; public class Main { public static void main(String[] args) {
【小家java】Java執行緒池之---ForkJoinPool執行緒池的使用以及原理
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
Java多執行緒系列--“JUC執行緒池”01之 執行緒池架構
概要 前面分別介紹了”Java多執行緒基礎”、”JUC原子類”和”JUC鎖”。本章介紹JUC的最後一部分的內容——執行緒池。內容包括: 執行緒池架構圖 執行緒池示例 執行緒池架構圖 執行緒池的架構圖如下: 1、Executor
Java多執行緒系列--“JUC執行緒池”05之 執行緒池原理(四)
概要 本章介紹執行緒池的拒絕策略。內容包括: 拒絕策略介紹 拒絕策略對比和示例 拒絕策略介紹 執行緒池的拒絕策略,是指當任務新增到執行緒池中被拒絕,而採取的處理措施。 當任務新增到執行緒池中之所以被拒絕,可能是由於:第一,執行緒池異常關閉。第二,任務數量
執行緒池ThreadPoolExecutor分析: 執行緒池是什麼時候建立執行緒的,佇列中的任務是什麼時候取出來的?
帶著幾個問題進入原始碼分析: 執行緒池是什麼時候建立執行緒的? 任務runnable task是先放到core到maxThread之間的執行緒,還是先放到佇列? 佇列中的任務是什麼時候取出來的? 什麼時候會觸發reject策略? core到maxThread之間的執行緒什麼時候會di
基於執行緒池的多執行緒售票demo
廢話不多說,直接就開擼 import org.springframework.util.StopWatch; import java.util.concurrent.*; /** * 基於執行緒池實現的多執行緒賣票demo * joey li * 2018-4-12 *
執行緒池---友好的執行緒池命名
大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油,這個公眾號已經接入圖靈 之前介紹過java 推薦的執行緒池和如何自定義執行緒池 https://mp.csdn.net/postedit/81783309 今天在使用執行緒池的時候發現執行
.NET執行緒池最大執行緒數的限制-記一次IIS併發瓶頸
.NET ThreadPool 最大執行緒數的限制 IIS併發瓶頸,有幾個地方,IIS執行緒池的最大佇列數,工作程序數,最大併發數。這些這裡就不展開。主要是最近因為過度使用Task 導致的執行緒數佔用過多,所以實驗了一下 .net執行緒池 的限制,分享一下。 注意IIS執行緒池與.NET執行緒池不是同一個東西
C# 執行緒池中取消執行緒的三種方式
三種方式都使用CancellationToken,只是使用方式不同,有類似於採用全域性標誌位的方式 第一種 檢測IsCancellationRequested方式 static void AsyncOperation1(CancellationToken t
Android 執行緒池模擬多執行緒併發下載任務
廢話不多,直接上原始碼 自定義一個Adapter public class MyAdapter extends BaseAdapter { private Context context; private List<Progress> list
Java實現終止執行緒池中正在執行的定時任務
貼個廣告 樓主的部落格已全部搬遷至自己的部落格,感興趣的小夥伴請移步haifeiWu與他朋友們的部落格專欄 源於開發 最近專案中遇到了一個新的需求,就是實現一個可以動態新增定時任務的功能。說到這裡,有人可能會說簡單啊,使用quartz就好了,簡單粗暴。然而
Java 多執行緒池ThreadPoolExecutor解析及Executors類中提供的靜態方法來建立執行緒池
上面的程式碼可能看起來不是那麼容易理解,下面我們一句一句解釋: 首先,判斷提交的任務command是否為null,若是null,則丟擲空指標異常; 接著是這句,這句要好好理解一下: if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(c
jdk單例執行緒池和sping執行緒池使用
java提供的原生執行緒池技術處理原理很清晰,故只要使用自己的原生執行緒池技術一般都能滿足專案的需求。java提供了很好的執行緒池實現,比我們自己的實現要更加健壯以及高效,同時功能也更加強大,不建議自己編寫。另外有同學可能用過spring的執行緒池,那麼spring執行緒
監控 Java 執行緒池及檢測執行緒池執行緒狀態
轉自:https://www.jianshu.com/p/2c4c49e3a758 之前寫過一篇 Java 執行緒池的使用介紹文章《執行緒池全面解析》,全面介紹了什麼是執行緒池、執行緒池核心類、執行緒池工作流程、執行緒池分類、拒絕策略、及如何提交與關閉執行緒池等。 但在實際開發過程中,線上程