ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去
最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個線程中值串來串去,排查一番,確定問題為線程池的問題,線程池中的線程是會重復利用的,而ThreadLocal是用線程來做Key的所以在使用線程池的時候要特別註意ThreadLocal.
ThreadLocal數據是在線程創建時綁定在線程上的, 所以解決方法是在使用數據之前調用remove() 移除掉之前的其他線程產生的數據
解決方法
重構remove方法
@Override
public void remove() {
super.remove();
initialValue();
}
先remove, 然後再初始化一次, 這樣就可以保證數據是幹凈的了.
當然你也可以在調用的finally裏面使用remove, 也是可以的.
ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去
相關推薦
ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去
最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個執行緒中值串來串去,排查一番,確定問題為執行緒池的問題,執行緒池中的執行緒是會重複利用的,而ThreadLocal是用執行緒來做Key的所以在使用執行緒池的時候要特別注意ThreadL
ThreadLocal遇到線程池時, 各線程間的數據會互相幹擾, 串來串去
解決 調用 遇到 方法 adl finall key 重復 remove 最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個線程中值串來串去,排查一番,確定問題為線程池的問題,線程池中的線程是會重復利用的,而ThreadLocal是用線程來做Ke
使用線程池優化多線程編程
線程 回收 連接 eem popu sso 實例 技術 創建時間 Java中的對象是使用new操作符創建的,假設創建大量短生命周期的對象。這樣的方式性能很低下。為了解決問題,而發明了池技術。 對於數據庫連接有連接池,對於線程則有線程池。 本實例介紹兩種方式創建10
Java多線程系列--“JUC線程池”03之 線程池原理(二)
.cn 創建 計數 dex unbound max strong 一點 rem 線程池示例 在分析線程池之前,先看一個簡單的線程池示例。 import java.util.concurrent.Executors; import java.util.concurrent.
Python--線程隊列(queue)、multiprocessing模塊(進程對列Queue、管道(pipe)、進程池)、協程
有一種 啟動進程 fin 機制 內部 優先級隊列 queue類 解決 producing 隊列(queue) 隊列只在多線程裏有意義,是一種線程安全的數據結構。 get與put方法 ‘‘‘ 創建一個“隊列”對象 import queue q = queue.Que
線程池: 等待線程池內所有線程執行完畢後再繼續任務
繼續 con col await mina cut bsp src code boolean loop = true; do{ loop=!executorService.awaitTermination(2, TimeUnit.SECONDS); }while(
在使用線程池時應特別註意對ThreadLocal的使用
log 並且 重新 mac hive ava arch huang 線程池 使用ThreadLocal並且有線程池時要特別註意,ThreadLocal是以線程為key的,而線程池裏面的線程是會被重新利用的,所以如果有使用線程池並且使用ThreadLocal來保存狀態信息時要
Python 線程----線程方法,線程事件,線程隊列,線程池,GIL鎖,協程,Greenlet
opensta 回收 chunks www 不能 第一個元素 連接 none 恢復 主要內容: 線程的一些其他方法 線程事件 線程隊列 線程池 GIL鎖 協程 Greenlet Gevent 一. 線程(threading)的一些其他方法
Java多線程系列--“JUC線程池”04之 線程池原理(三)
以及 java div 鉤子 重載 ati 系列 lex 基礎 轉自:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介紹線程池的生命周期。在"Java多線程系列--“基礎篇”01之 基本概念"中,我們介紹過,線程有
Java多線程系列--“JUC線程池”01之 線程池架構
功能 err 一個表 @override 轉換 任務 新的 play ima 轉自:http://www.cnblogs.com/skywang12345/p/3509903.html 概要 前面分別介紹了"Java多線程基礎"、"JUC原子類"和"JUC鎖"。本章介紹JU
使用requests、re、BeautifulSoup、線程池爬取攜程酒店信息並保存到Excel中
備案 info imp lis sub host write count star import requests import json import re import csv import threadpool import time, random
Disruptor——一種可替代有界隊列完成並發線程間數據交換的高性能解決方案
top ogl align 來講 好處 文件 最優化 什麽 內存碎片 本文翻譯自LMAX關於Disruptor的論文,同時加上一些自己的理解和標註。Disruptor是一個高效的線程間交換數據的基礎組件,它使用柵欄(barrier)+序號(Sequencing)機制協
Java並發工具類之線程間數據交換工具Exchanger
catch exchanger 系統 chang data 完成後 () time ktr Exchanger是一個用於線程間協做的工具類,主要用於線程間的數據交換。它提供了一個同步點,在這個同步點,兩個線程可以彼此交換數據。兩個線程通過exchange方法交換數據,如
python 多進程——使用進程池,多進程消費的數據)是一個隊列的時候,他會自動去隊列裏依次取數據
10個 sta find 因此 pool 時間 import nbsp load 我的mac 4核,因此每次執行的時候同時開啟4個線程處理: # coding: utf-8 import time from multiprocessing import Pool d
進程池中的回調函數
pro bsp getpid ret col pri 並且 back pan # 回調函數 # 指定一個任務後、並且指定一個回調函數後,當指定的進程池執行的任務結束後,會將該任務的返回值作為回調函數的參數傳遞到回調函數中,並且回調函數得以執行 # 回調函數在主進
使用進程池模擬多進程爬取url獲取數據,使用進程綁定的回調函數去處理數據
utf 返回值 http baidu cnblogs ces print llb bytes 1 # 使用requests請求網頁,爬取網頁的內容 2 3 # 模擬使用進程池模擬多進程爬取網頁獲取數據,使用進程綁定的回調函數去處理數據 4 5 import
selenuim自動化爬取汽車在線谷米愛車網車輛GPS數據爬蟲
con objectid 正在 attr pla locate return url common #為了實時獲取車輛信息,以及為了後面進行行使軌跡繪圖,寫了一個基於selelnium的爬蟲爬取了車輛gps數據。 #在這裏發現selenium可以很好的實現網頁解析和處理j
Ansible 從遠程主機添加或刪除MySQL數據庫
border sin ans ext targe odin 工作 ble edi mysql_db - 從遠程主機添加或刪除MySQL數據庫。 概要 要求(在執行模塊的主機上) 選項 例子 筆記 狀態 支持 概要 從遠程主機添加或刪除MySQL數據庫。
建立一個帶頭結點的單向鏈表,鏈表中的各結點按結點數據中的數據遞增有序鏈接,函數fun的功能是:把形參x的值放入一個新結點並插入鏈表中,使插入後各結點數據域中的數據仍保持遞增有序
print lis void clu ret div clas head number #include <stdio.h> #include <stdlib.h> #define N 8 typedef struct l
Python多進程-進程間數據的傳遞
args gpo bubuko mage import image 反序 子進程 targe 兩個進程間的數據是獨立的,要進行數據傳遞的話可通過幾個方法 Queue # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" f