最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

有關(guān)ThreadLocal的面試題你真的懂了嗎

 更新時間:2019年06月20日 08:39:24   作者:匠心零度  
這篇文章主要介紹了面試題ThreadLocal,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

說明

面試官:講講你對ThreadLocal的一些理解。

那么我們該怎么回答呢????你也可以思考下,下面看看零度的思考;

  • ThreadLocal用在什么地方?
  • ThreadLocal一些細節(jié)!
  • ThreadLocal的最佳實踐!
  • 思考

ThreadLocal用在什么地方?

討論ThreadLocal用在什么地方前,我們先明確下,如果僅僅就一個線程,那么都不用談ThreadLocal的,ThreadLocal是用在多線程的場景的?。?!

ThreadLocal歸納下來就2類用途:

  • 保存線程上下文信息,在任意需要的地方可以獲?。。?!
  • 線程安全的,避免某些情況需要考慮線程安全必須同步帶來的性能損失?。。?/li>

保存線程上下文信息,在任意需要的地方可以獲取?。?!

由于ThreadLocal的特性,同一線程在某地方進行設(shè)置,在隨后的任意地方都可以獲取到。從而可以用來保存線程上下文信息。

常用的比如每個請求怎么把一串后續(xù)關(guān)聯(lián)起來,就可以用ThreadLocal進行set,在后續(xù)的任意需要記錄日志的方法里面進行g(shù)et獲取到請求id,從而把整個請求串起來。

還有比如Spring的事務(wù)管理,用ThreadLocal存儲Connection,從而各個DAO可以獲取同一Connection,可以進行事務(wù)回滾,提交等操作。

備注: ThreadLocal的這種用處,很多時候是用在一些優(yōu)秀的框架里面的,一般我們很少接觸,反而下面的場景我們接觸的更多一些!

線程安全的,避免某些情況需要考慮線程安全必須同步帶來的性能損失!??!
ThreadLocal為解決多線程程序的并發(fā)問題提供了一種新的思路。但是ThreadLocal也有局限性,我們來看看阿里規(guī)范:

每個線程往ThreadLocal中讀寫數(shù)據(jù)是線程隔離,互相之間不會影響的,所以ThreadLocal無法解決共享對象的更新問題!

由于不需要共享信息,自然就不存在競爭問題了,從而保證了某些情況下線程的安全,以及避免了某些情況需要考慮線程安全必須同步帶來的性能損失?。?!

這類場景阿里規(guī)范里面也提到了:

ThreadLocal一些細節(jié)!

ThreaLocal使用示例代碼:

public class ThreadLocalTest {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
threadLocal.set(i);
System.out.println(Thread.currentThread().getName() + "====" + threadLocal.get());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
threadLocal.remove();
}
}, "threadLocal1").start();
new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "====" + threadLocal.get());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
threadLocal.remove();
}
}, "threadLocal2").start();
}
}

代碼截圖:

代碼運行結(jié)果:

從運行的結(jié)果我們可以看到threadLocal1進行set值對threadLocal2并沒有任何影響!

Thread、ThreadLocalMap、ThreadLocal總覽圖

Thread類有屬性變量threadLocals (類型是ThreadLocal.ThreadLocalMap),也就是說每個線程有一個自己的ThreadLocalMap ,所以每個線程往這個ThreadLocal中讀寫隔離的,并且是互相不會影響的。

一個ThreadLocal只能存儲一個Object對象,如果需要存儲多個Object對象那么就需要多個ThreadLocal!??!

如圖:

看到上面的幾個圖,大概思路應(yīng)該都清晰了,我們Entry的key指向ThreadLocal用虛線表示弱引用 ,下面我們來看看ThreadLocalMap:

java對象的引用包括 : 強引用,軟引用,弱引用,虛引用 。

因為這里涉及到弱引用,簡單說明下:

弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內(nèi)存是否充足,該對象僅僅被弱引用關(guān)聯(lián),那么就會被回收。

當僅僅只有ThreadLocalMap中的Entry的key指向ThreadLocal的時候,ThreadLocal會進行回收的!??!

ThreadLocal被垃圾回收后,在ThreadLocalMap里對應(yīng)的Entry的鍵值會變成null,但是Entry是強引用,那么Entry里面存儲的Object,并沒有辦法進行回收,所以ThreadLocalMap 做了一些額外的回收工作。

雖然做了但是也會存在內(nèi)存泄漏風(fēng)險(我沒有遇到過,網(wǎng)上很多類似場景,所以會提到后面的ThreadLocal最佳實踐?。。。?/p>

ThreadLocal的最佳實踐!

ThreadLocal被垃圾回收后,在ThreadLocalMap里對應(yīng)的Entry的鍵值會變成null,但是Entry是強引用,那么Entry里面存儲的Object,并沒有辦法進行回收,所以ThreadLocalMap 做了一些額外的回收工作。

備注: 很多時候,我們都是用在線程池的場景,程序不停止,線程基本不會銷毀?。?!

由于線程的生命周期很長,如果我們往ThreadLocal里面set了很大很大的Object對象,雖然set、get等等方法在特定的條件會調(diào)用進行額外的清理,但是ThreadLocal被垃圾回收后,在ThreadLocalMap里對應(yīng)的Entry的鍵值會變成null,但是后續(xù)在也沒有操作set、get等方法了。

所以最佳實踐,應(yīng)該在我們不使用的時候,主動調(diào)用remove方法進行清理。

這里把ThreadLocal定義為static還有一個好處就是,由于ThreadLocal有強引用在,那么在ThreadLocalMap里對應(yīng)的Entry的鍵會永遠存在,那么執(zhí)行remove的時候就可以正確進行定位到并且刪除?。?!

最佳實踐做法應(yīng)該為:

try {
// 其它業(yè)務(wù)邏輯
} finally {
threadLocal對象.remove();
}

思考

如果面試的時候,可以把上面的內(nèi)容都可以講到,個人覺得就非常好了,回答的就挺完美了。但是如果你可以進行下面的回答,那么就更完美了。

對于ThreadLocal,我在看Netty源碼的時候,還了解過FastThreadLocal,xxxxx一些列內(nèi)容,那就是一個升級了。

在我本地進行測試,F(xiàn)astThreadLocal的吞吐量是jdkThreadLocal的3倍左右。

相關(guān)文章

  • Spring中XML schema擴展機制的深入講解

    Spring中XML schema擴展機制的深入講解

    這篇文章主要給大家介紹了關(guān)于Spring中XML schema擴展機制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • JavaGUI實現(xiàn)隨機單詞答題游戲

    JavaGUI實現(xiàn)隨機單詞答題游戲

    這篇文章主要為大家詳細介紹了JavaGUI實現(xiàn)隨機單詞答題游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Spring Boot 啟動注解過程分析

    Spring Boot 啟動注解過程分析

    這篇文章主要為大家介紹了Spring Boot 啟動注解過程示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • MyBatisPlus查詢投影與查詢條件詳細講解

    MyBatisPlus查詢投影與查詢條件詳細講解

    這篇文章主要介紹了MyBatisPlus DQL編程控制中的查詢投影、查詢條件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java swing 實現(xiàn)加載自定義的字體

    java swing 實現(xiàn)加載自定義的字體

    這篇文章主要介紹了java swing 實現(xiàn)加載自定義的字體,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java線程優(yōu)先級原理詳解

    java線程優(yōu)先級原理詳解

    這篇文章主要介紹了java線程優(yōu)先級原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • springboot使用CommandLineRunner解決項目啟動時初始化資源的操作

    springboot使用CommandLineRunner解決項目啟動時初始化資源的操作

    這篇文章主要介紹了springboot使用CommandLineRunner解決項目啟動時初始化資源的操作,幫助大家更好的理解和學(xué)習(xí)使用springboot框架,感興趣的朋友可以了解下
    2021-02-02
  • 解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題

    解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題

    這篇文章主要給大家解決了IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題,文中有詳細的解決步驟,如果有遇到一樣問題的小伙伴,可以參考閱讀本文
    2023-09-09
  • spring中Mapstruct屬性映射的實現(xiàn)

    spring中Mapstruct屬性映射的實現(xiàn)

    本文主要介紹了spring中Mapstruct屬性映射的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Springboot整合Mybatis傳值的常用方式總結(jié)

    Springboot整合Mybatis傳值的常用方式總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Springboot的相關(guān)知識,文章圍繞著Springboot整合Mybatis傳值的常用方式展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論

徐水县| 沂源县| 河池市| 连州市| 图片| 无锡市| 政和县| 新干县| 云浮市| 兴宁市| 小金县| 望谟县| 永顺县| 邵东县| 广州市| 南靖县| 莱阳市| 双鸭山市| 玛多县| 微博| 额尔古纳市| 宜州市| 衡南县| 西乌珠穆沁旗| 建宁县| 遵化市| 石屏县| 罗江县| 河津市| 黄平县| 阿拉善盟| 钟山县| 宜宾县| 安溪县| 临漳县| 吉首市| 秀山| 南川市| 旌德县| 麻江县| 和平区|