日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThreadLocal的原理与使用

發布時間:2025/3/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThreadLocal的原理与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

通過源碼解讀ThreadLocal類的實現

?

ThreadLocal類提供了以下幾個方法

?

  • get()方法是用來獲取ThreadLocal在當前線程中保存的變量副本
  • set()用來設置當前線程中變量的副本
  • remove()用來移除當前線程中變量的副本
  • initialValue()是一個protected方法,一般是用來在使用時進行重寫的,它是一個延遲加載方法
  • 首先我們來看一下ThreadLocal是如何為每個線程創建一個變量副本的:

    ???? 第160行,獲取當前線程對象實例

    ?? 第161行,通過當前線程對象實例獲取一個ThreadLocalMap,這個map是ThreadLocal類的一個內部靜態類,

    ?? 如果map不為空接著獲取map中的entry,

    這里獲取鍵值對傳進去的是? this,而不是當前線程t

    ?? 如果獲取成功,則返回value

    ? ?如果map為空,則調用setInitialValue方法返回value

    ?? 我們上面的每一句來仔細分析:

    ??? 首先看一下getMap方法中做了什么?

    ??

    getMap中,是調用當期線程t,返回當前線程t中的一個成員變量threadLocals

    那么我們繼續取Thread類中取看一下成員變量threadLocals是什么:

    實際上就是一個ThreadLocalMap,這個類型是ThreadLocal類的一個內部類,我們繼續取看ThreadLocalMap的實現:

    ?

    可以看到ThreadLocalMapEntry繼承了WeakReference,并且使用ThreadLocal作為鍵值。

    然后再繼續看setInitialValue方法的具體實現:

    很容易了解,就是如果map不為空,就設置鍵值對,為空,再創建Map,看一下createMap的實現:

    以上源碼就可以看出:

    首先在每個線程Thread內部有一個ThreadLocal.ThreadLocalMap類型的成員變量threadLocals,這個threadLocals就是用來存儲實際變量副本的,鍵值為當前ThreadLocal變量,value為變量副本(即T類型的變量)。

    初始時,在Thread里面,threadLocals為空,當通過ThreadLocal變量調用get()方法或者set()方法,就會對Thread類中的threadLocals進行初始化,并且以當前ThreadLocal變量為鍵值,以ThreadLocal要保存的副本變量為value,存到threadLocals。

    ?

    轉載于:https://my.oschina.net/shxjinchao/blog/1936469

    總結

    以上是生活随笔為你收集整理的ThreadLocal的原理与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。