TransmittableThreadLocal線程間上下文傳遞總結(jié)

背景

在項(xiàng)目開發(fā)的過程中,難免需要線程之間進(jìn)行值傳遞問題;對于這樣的問題首先想到的肯定是JDKInheritableThreadLocal類可以完成父線程到子線程的值傳遞。但對于使用線程池等會(huì)池化復(fù)用線程的組件的情況,線程由線程池創(chuàng)建好,并且線程是池化起來反復(fù)使用的;這時(shí)父子線程關(guān)系的ThreadLocal值傳遞已經(jīng)沒有意義,應(yīng)用需要的實(shí)際上是把 任務(wù)提交給線程池時(shí)ThreadLocal值傳遞到 任務(wù)執(zhí)行時(shí)。對于這種情況就想到使用阿里巴巴提供的Transmittable ThreadLocal(TTL)庫,庫的使用介紹參見https://github.com/alibaba/transmittable-thread-local

場景說明

場景時(shí)序圖說明

創(chuàng)建了一個(gè)數(shù)據(jù)權(quán)限框架,這個(gè)框架根據(jù)線程上下文ThreadLocal中的對應(yīng)的隊(duì)列中是否含義注解和對應(yīng)的自定義數(shù)據(jù)權(quán)限控制注解的內(nèi)容,進(jìn)行數(shù)據(jù)權(quán)限過濾

踩到坑

在上圖中步驟4中放入到ThreadLocal中的內(nèi)容,希望在進(jìn)行數(shù)據(jù)權(quán)限控制的時(shí)候能夠用到,且在步驟9中放入ThreadLocal中的數(shù)據(jù)權(quán)限自定義注解不要影響前面調(diào)度任務(wù)對應(yīng)的數(shù)據(jù)權(quán)限控制;實(shí)際上由于調(diào)度任務(wù)采用的線程池,而且對應(yīng)的ThreadLocal采用的是Transmittable ThreadLocal,但是使用的Transmittable ThreadLocal對應(yīng)的默認(rèn)copy方法(默認(rèn)copy方法時(shí)淺拷貝),再加上我們的對應(yīng)的ThreadLocal變量類型的Deque,所以出現(xiàn)了在步驟9中放入的數(shù)據(jù)權(quán)限自定義注解會(huì)影響前面步驟對應(yīng)的數(shù)據(jù)權(quán)限控制;所以通過查看文檔,可以通過重新Transmittable ThreadLocal對應(yīng)的copy方法來實(shí)現(xiàn),通過重寫copy方法將淺拷貝重寫為深度拷貝就可以解決這個(gè)問題:子線程依賴父線程ThreadLocal中的內(nèi)容,但是子線程ThreadLocal的修改不會(huì)反過來影響父線程的ThreadLocal

參考

https://github.com/alibaba/transmittable-thread-local

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。