關於ThreadLocal的理解

ThreadLocal

ThreadLocal是一個關於建立線程局部變量的類。 一般狀況下,咱們建立的變量是能夠被任何一個線程訪問並修改的。而使用ThreadLocal建立的變量只能被當前線程訪問,其餘線程則沒法訪問和修改。安全

  1. 建立,支持泛型,有get,set方法
ThreadLocal<String> stringThreadLocal = new ThreadLocal<>();
  1. 簡單使用
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();
}
  1. 爲ThreadLocal設置默認的get初始值,須要重寫initialValue方法.ide

  2. 實際上ThreadLocal的值是放入了當前線程的一個ThreadLocalMap實例中,因此只能在本線程中訪問,其餘線程沒法訪問。ThreadLocal實例實際上也是被其建立的類持有。而ThreadLocal的值其實也是被線程實例持有。它們都是位於堆上,只是經過一些技巧將可見性修改爲了線程可見。關於堆和棧的比較,請參考Java中的堆和棧的區別.net

  3. 它的使用場景有: 實現單個線程單例以及單個線程上下文信息存儲,好比交易id等。 實現線程安全,非線程安全的對象使用ThreadLocal以後就會變得線程安全,由於每一個線程都會有一個對應的實例。 承載一些線程相關的數據,避免在方法中來回傳遞參數。線程

相關文章
相關標籤/搜索