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(); }