非同步執行緒threadLocal中物件獲取失敗

2021-10-04 03:12:01 字數 390 閱讀 5102

問題描述

在乙個比較複雜的業務中,同步執行了主任務,將與當前任務無關的任務丟進了非同步執行緒,然後發現非同步執行緒沒有獲取到使用者。所有的非同步任務都沒有執行下去。

排查1.直接debug,發現任務在非同步方法開始執行就失敗了,沒有進入非同步方法;

2.打log,非同步方法前的log列印了,之後的沒有。

3.仔細看**,發現了開啟非同步執行緒**參直接來自threadlocal,找到問題了,明顯的子執行緒獲取父執行緒物件問題。

解決直接先獲取父執行緒的物件,然後傳遞到子執行緒。

思考如果是簡單的父執行緒向子執行緒傳值直接把物件傳過去就完事

如果涉及到子執行緒和父執行緒之間的互動,那麼就需要更加複雜的操作了,threadlocal和inheritablethreadlocal深入分析這篇文章可以解惑

執行緒ThreadLocal類

threadlocal 在很多地方叫做本地變數,在有些地方叫做執行緒本地儲存。threadlocal 在每個執行緒中為每個變數都建立了乙個副本,每個執行緒可以訪問自己內部的副本變數,而不會對其它執行緒的副本變數造成影響。如果看不懂沒關係,下面會解釋各個函式的意思。public t get publi...

多執行緒 ThreadLocal

目錄 一 threadlocal 概述 1.1 threadlocal 是什麼 1.2 threadlocal 的作用 二 threadlocal 的使用和原始碼分析 2.1 threadlocal 如何使用 2.1.1 常見方法 2.1.2 使用示例 2.2 threadlocal 原始碼分析 2...

多執行緒 ThreadLocal

執行緒的變數副本 就像命名一樣 每個執行緒隔離。每個thread都有自己的threadlocalmap,threadlocalmap的底層是使用陣列 其中每個entry,它的key是threadlocal k,繼承自weakreference,也就是我們常說的弱引用型別,可以簡單地將它的key視作t...