多線程併發神器--ThreadLocal

什麼是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應用比較普遍,若是不是濫用,利是大於憋的。

推薦去個人博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿里巴巴等大廠最新面試題

以爲不錯,別忘了點贊+轉發哦!

相關文章
相關標籤/搜索