java多线程之ThreadLoal详解
一、ThreadLocal簡介
多線程訪問同一個共享變量時特別容易出現(xiàn)并發(fā)問題,特別是在多個線程需要對一個共享變量進(jìn)行寫入時。為了保證線程安全,一般使用者在訪問共享變量時需要進(jìn)行適當(dāng)?shù)耐?/p>
同步一般是通過加鎖來實(shí)現(xiàn)的,但這對用戶有一定要求,加重了使用者的負(fù)擔(dān).使用ThredLocal就可以做到,創(chuàng)建一個變量后,每個線程對其訪問的時候訪問的是自己創(chuàng)建的變量.
如果你創(chuàng)建了一個ThreadLocal變量,那么訪問這個變量的每個線程都會擁有一個這個變量的副本.操作的時候也是操作的屬于自己這個線程的變量,從而避免了線程安全問題.
二、ThreadLocal使用示例
運(yùn)行結(jié)果如下
threadOne:threadOne local variable threadOne remove after:threadOne local variable threadTwo:threadTwo local variable threadTwo remove after:threadTwo local variable線程One中的代碼3.1通過set方法設(shè)置了localVariable的值,這其實(shí)設(shè)置的是線程One本地內(nèi)存中的一個副本,這個副本線程Two是訪問不了的。然后代碼3.2調(diào)用了print函數(shù),代碼1.1通過get函數(shù)獲取了當(dāng)前線程(線程One)本地內(nèi)存中l(wèi)ocalVariable的值。
線程Two的執(zhí)行類似于線程One。
將localVariable.remove 這一句代碼的注釋刪除
static void print(String str) {//1.1 打印當(dāng)前線程本地內(nèi)存中l(wèi)ocalVariable變量的值System.out.println(str + ":" + localVariable.get());//清除當(dāng)前線程本地內(nèi)存中的localVariable的值//localVariable.remove();}運(yùn)行結(jié)果如下所示:
threadOne:threadOne local variable threadOne remove after:null threadTwo:threadTwo local variable threadTwo remove after:null三、ThreadLocal實(shí)現(xiàn)原理
首先看一下ThreadLocal相關(guān)類的類圖結(jié)構(gòu)
由該圖可知,Thread類中有一個threadLocals和一個inheritableThreadLocals,它們都是ThreadLocalMap類型的變量.而ThreadLocalMap是一個定制化的Hashmap。在默認(rèn)情況下,每個線程中的這兩個變量都為null,只有當(dāng)前線程第一次調(diào)用ThreadLocal的set或者get方法時才會創(chuàng)建它們。其實(shí)每個線程的本地變量不是存放在ThreadLocal實(shí)例里面,而是存放在調(diào)用線程的threadLocals變量里面。
也就是說,ThreadLocal類型的本地變量存放在具體的線程內(nèi)存空間中。ThreadLocal就是一個工具殼,它通過set方法把value值放入調(diào)用線程的threadLocals里面并存放起來,當(dāng)調(diào)用線程調(diào)用它的get方法時,再從當(dāng)前線程的threadLocals變量里面將其拿出來使用。
如果調(diào)用線程一直不終止,那么這個本地變量會一直存放在調(diào)用線程的threadLocals變量里面,所以當(dāng)不需要使用本地變量時可以通過調(diào)用ThreadLocal變量的remove方法,從當(dāng)前線程的threadLocals里面刪除該本地變量。另外,Thread里面的threadLocals為何被設(shè)計(jì)為map結(jié)構(gòu)?很明顯是因?yàn)槊總€線程可以關(guān)聯(lián)多個ThreadLocal變量。
總結(jié)
以上是生活随笔為你收集整理的java多线程之ThreadLoal详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python精要(73)-函数传递任意参
- 下一篇: 端计算(1)-wasm