什麼是ThreadLocal
能夠理解成線程本地變量,傳統的線程對一個變量操做時操做的是同一個對象,也存在線程安全的問題。java
ThreadLocal是一個變量的本地副本,線程對變量的操做不會影響其餘線程。面試
首先看看ThreadLocal的類結構數據庫
其中可重寫的方法有如下幾個後端
initialValue():ThreadLocal初始化的值,新建ThreadLocal的通常要重寫給個初始的值。安全
get():獲取當前線程變量的副本值。session
set(T value):設置、更新當前線程上的變量副本值。多線程
remove():移除當前線程上的變量副本。架構
ThreadLocal使用
新建ThreadLocal,類型爲User,並初始化爲tom,12歲,啓動3個線程,每一個線程循環3次,休眠1少,主線程再輸出。工具
輸出結果以下spa
從結果可見每一個線程使用的是各自線程的變量副本,並無影響其餘線程和主線程,實現了線程隔離的效果。
使用場景
通常用來解決數據庫鏈接、用戶session管理等。
內存泄露問題
若是線程的執行週期過長可能致使內存泄露的風險,雖然線程執行完後會ThreadLocal也會隨着銷燬,但最好使用完後加上remove這樣會加快內存的釋放,通常來講線程週期不長是不太會引發內存泄露的。還有若是定義了ThreadLocal又不用也有問題,由於每次ThreadLocal的get/set/remove操做都會清理無效的key加快內存釋放。ThreadLocal應用比較普遍,若是不是濫用,利是大於憋的。
推薦去個人博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
以爲不錯,別忘了點贊+轉發哦!