threadlocal學習

java threadlocal線程結束會釋放當前線程的數據嗎?

不會清空,要你自己去清空。

只有當ThreadLocal的生命週期受限於Task的生命週期時,在Thread Pool的Thread裏使用ThreadLocal纔有意義。

Task指的是一個Thread所執行的任務。總之,如果你能夠在使用ThreadLocal的時候管理它的創建、銷燬,那麼就可以用,否則會出問題。原因是ThreadLocal是和Thread綁定的,如果Thread是從Thread Pool中拿出來的,那麼意味着Thread可能會被複用,如果被複用,你就一定得保證這個Thread上一次結束的時候,其關聯的ThreadLocal被清空掉,否則就會串到下一次使用。

 

線程池中用了Threadlocal

線程會被複用,但是每次都會set新值,只關心現在線程中的值,之前用這個線程已經走完流程了。!

每個線程都有自己的的ThreadLocalMap,保存一個對象中的多個threadlocal對象,this是這個threadlocal對象!!1

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章