ThreadLocal是一個關於建立線程局部變量的類。 一般狀況下,咱們建立的變量是能夠被任何一個線程訪問並修改的。而使用ThreadLocal建立的變量只能被當前線程訪問,其餘線程則沒法訪問和修改。安全
ThreadLocal<String> stringThreadLocal = new ThreadLocal<>();
private void test() { Thread t = new Thread() { ThreadLocal<String> stringThreadLocal = new ThreadLocal<>(); @Override public void run() { super.run(); stringThreadLocal ("www.yuxianghe.net"); stringThreadLocal (); } }; t.start(); }
爲ThreadLocal設置默認的get初始值,須要重寫initialValue方法.ide
實際上ThreadLocal的值是放入了當前線程的一個ThreadLocalMap實例中,因此只能在本線程中訪問,其餘線程沒法訪問。ThreadLocal實例實際上也是被其建立的類持有。而ThreadLocal的值其實也是被線程實例持有。它們都是位於堆上,只是經過一些技巧將可見性修改爲了線程可見。關於堆和棧的比較,請參考Java中的堆和棧的區別 。.net
它的使用場景有: 實現單個線程單例以及單個線程上下文信息存儲,好比交易id等。 實現線程安全,非線程安全的對象使用ThreadLocal以後就會變得線程安全,由於每一個線程都會有一個對應的實例。 承載一些線程相關的數據,避免在方法中來回傳遞參數。線程