相關(guān)源碼:boy-learning-thread
個人博客:http://bruce.bugmakers.club
內(nèi)容來自《網(wǎng)易微專業(yè) - 高性能編程章節(jié)》
線程封閉之ThreadLocal和棧封閉
線程封閉概念
背景:多線程訪問共享可變數(shù)據(jù)時,涉及到線程間數(shù)據(jù)同步的問題。并不是所有時候,都要用到共享數(shù)據(jù),所以線程封閉概念就提出來了。
線程封閉:數(shù)據(jù)都被封閉在各自的線程之中,就不需要同步,這種將數(shù)據(jù)封閉在線程之中而避免使用同步的技術(shù)稱。
線程封閉具體的體現(xiàn)有:ThreadLocal、局部變量。
ThreadLocal
ThreadLocal 是 Java 里一種特殊的變量。
它是一個線程級別的變量,每個線程都有一個 ThreadLocal 就是每個線程都有了自己獨(dú)立的一個變量,競爭條件徹底被消除了,在并發(fā)模式下是絕對安全的變量。
用法:
ThreadLocal<T> var = new ThreadLocal<T>();
會自動在每一個線程上創(chuàng)建一個 T 的副本,副本之間彼此獨(dú)立,互不影響。
可以用 ThreadLocal 存儲一些參數(shù),以便在線程中多個方法中使用,用來代替方法傳參的做法。
實(shí)在難以理解,可以理解為,JVM維護(hù)了一個 Map<Thread, T>,每個線程要用這個 T 的時候,用當(dāng)前線程去 Map 里取。——僅作為概念理解。
棧封閉(局部變量)
局部變量的固有屬性之一就是封閉在線程中。
它們被存儲在執(zhí)行線程的棧內(nèi)存中,其他線程無法訪問這個棧。