https://www.imooc.com/article/34602
ThreadLocal是用來提供線程內部的局部變量为严,他可以在多線程訪問的情況下保證各個線程的變量獨立于其他的線程柴底,在當前線程隨時隨地可以獲取。它是一種用空間處理并發(fā)的解決方式阵子。(鎖是用時間處理)
實現原理是一個跟線程綁定的Map国裳,ThreadLocalMap狠半,他的key是ThreadLocal對象本身穴墅,value是存的值。這樣設計有一下幾點好處:
1斋枢、 可以讓每個Map的entry數量變少帘靡,由treadlocal對象數量決定。
2杏慰、 可以在線程結束的時候銷毀测柠,節(jié)省內存。
他的set缘滥,get轰胁,remove方法在最后都會清除key是null的entry,防止內存泄露朝扼。
Entry繼承了WeakReference赃阀,當ThreadLocal被釋放的時候,ThreadLocal會被回收擎颖,Entry的key變?yōu)閚ull榛斯,在下一次get,set的時候刪除搂捧,但是如果使用static的ThreadLocal驮俗,延長了ThreadLocal的生命周期,還是可能導致的內存泄漏允跑。所以需要合理使用王凑。
在使用線程池的情況下,沒有及時清理ThreadLocal聋丝,不僅是內存泄漏的問題索烹,更嚴重的是可能導致業(yè)務邏輯出現問題。所以弱睦,使用ThreadLocal就跟加鎖完要解鎖一樣百姓,用完就清理。