ThreadLocal的學習

做用域

方法之上,線程以內java

做用

用戶要跨方法訪問變量,但若變量是全局變量的話雖然能訪問了,但可能會產生併發問題,這時能夠把要共享的值放入ThreadLocal中,線程內都能訪問到,但全部線程訪問卻只能訪問本身的,沒法訪問其餘線程的,這就至關於線程私有的共享變量併發

原理

ThreadLocal至關於在內部作了線程識別,哪條線程放進該全局變量的數據,只有該線程才能訪問。異步

實現

Thread類有個屬性,持有ThreadLocal的靜態內部類ThreadLocalMap的引用,放進來的值就存放在這裏。ThreadLocal的經常使用操做get/set/remove中,都是先根據Thread.currentThread()獲取當前線程這個對象,而後根據這個對象獲取其屬性中ThreadLocalMap的引用threadLocals,這個map以當前線程做爲key,放進的值做爲value來存取,所以當前線程只能獲取當前線程放進去的值了,從而達到識別線程的效果。spa

  • 其至關於與線程綁定的變量,至關於線程私有的共享變量,因此最難把握的是"不知道哪裏是源頭"
  • 如果沒有刪除,則變量的生命週期與線程同長,如果線程歸屬於某個線程池,那麼生命週期更是長久
  • 不該該用於異步程序,由於其與線程綁定,而回調時繼續執行的多是另外一個線程

總結

這更可能是一種技巧,而不是技術,其並不是是什麼語言新特性,不過是封裝了這些手段和技巧,從而達到了對於不瞭解的人來講像java語言的一種特性同樣,甚至java的特性不過也是對更底層的一種封裝而已。線程

相關文章
相關標籤/搜索