『Java并發(fā)編程』ThreadLocal的使用

ThreadLocal是Java并發(fā)編程中的常用類,可以解決多個線程共享變量問題,這是不同于“synchronized”的解決方法。

ThreadLocal介紹

ThreadLocal在每個線程中維護一個映射MAP,每個線程都單獨有一個變量的副本,實現(xiàn)線程間變量隔離。
在并發(fā)編程中,我們可能會遇到多個線程使用同一變量的情境。比如T1,T2,兩個線程,T1在操作某對象時T2也同時操作該對象,造成數(shù)據混亂,結果與預期不符。對于這種情況常用做法是對操作對象進行同步處理(synchronized),但是同步操作會降低執(zhí)行效率。ThreadLocal提供了另一種方式來解決并發(fā)問題,每個線程都操作同一個變量的副本,不影響其他線程中該變量的值。

ThreadLocal常用方法

ThreadLocal類主要有get(),set(T value)remove(),initialValue()幾個方法,結構簡單清晰。

  • get()方法可以獲得該線程所維護的Map表,如果在之前沒有使用set(T value)方法設值,則會獲得null值,所以建議重寫initialValue()方法,自定義默認返回值。
  • set(T value)用來設置當前線程中該ThreadLocal對應的值,Key是該ThreadLocal的引用。
  • remove()方法用來擦除線程中當前Threadlocal所映射的值。
  • initialValue()是定義默認返回值的方法,推薦在使用ThreadLocal時重寫該方法,自定義默認返回值。
//創(chuàng)建ThreadLocal時重寫initialValue()方法
public class TestThreadLocal {
    private static final ThreadLocal<String> value = new ThreadLocal<String>() {
        @Override
        protected String initialValue() {
            return "Djz";
        }
    };
}

ThreadLocal總結

  • 使用ThreadLocal可以在每個線程中保存同一個變量的副本,值相同,但是各線程操作的是自己線程中所保存的副本,不會互相影響,不同于同步操作思路解決了多線程并發(fā)問題。
  • ThreadLocal類將自己的引用作為Key值,存儲對象作為Value,存儲在每個線程所維護的Map映射表中,這樣設計可以使Map與線程綁定,當線程被銷毀后,所維護的Map映射表也會被銷毀。
  • 在創(chuàng)建ThreadLocal建議重寫initialValue()方法,因為該方法默認返回null值,存在NPE隱患。
  • 由于ThreadLocal提供了線程內部的局部變量,因此該變量生命周期與線程相同,當線程銷毀時該局部變量也會銷毀。
  • 因為ThreadLocal是在每個線程中都存儲一個對象的副本,因此對內存的消耗相比不使用ThreadLocal更大。
  • ThreadLocal也解決了變量傳遞問題,在整個線程內ThreadLocal所映射的對象全局共享,降低了編碼時的復雜度。

文章內容為個人理解,如有錯誤歡迎指出。

郵箱:CodingDjz@126.com

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容