新聞中心
多線程訪問(wèn)同一個(gè)共享變量的時(shí)候容易出現(xiàn)并發(fā)問(wèn)題,特別是多個(gè)線程對(duì)一個(gè)變量進(jìn)行寫(xiě)入的時(shí)候,為了保證線程安全,一般使用者在訪問(wèn)共享變量的時(shí)候需要進(jìn)行額外的同步措施才能保證線程安全性。ThreadLocal是除了加鎖這種同步方式之外的一種保證一種規(guī)避多線程訪問(wèn)出現(xiàn)線程不安全的方法,當(dāng)我們?cè)趧?chuàng)建一個(gè)變量后,如果每個(gè)線程對(duì)其進(jìn)行訪問(wèn)的時(shí)候訪問(wèn)的都是線程自己的變量這樣就不會(huì)存在線程不安全問(wèn)題。

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的郁南網(wǎng)站建設(shè)公司,郁南接單;提供成都網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行郁南網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
ThreadLocal是JDK包提供的,它提供線程本地變量,如果創(chuàng)建一樂(lè)ThreadLocal變量,那么訪問(wèn)這個(gè)變量的每個(gè)線程都會(huì)有這個(gè)變量的一個(gè)副本,在實(shí)際多線程操作的時(shí)候,操作的是自己本地內(nèi)存中的變量,從而規(guī)避了線程安全問(wèn)題。
用法
多個(gè)線程在調(diào)用同一個(gè)方法的時(shí)候,會(huì)有并發(fā)問(wèn)題,解決這種問(wèn)題最簡(jiǎn)單的辦法就是將數(shù)據(jù)保存在Thread的自己的結(jié)構(gòu)中,也就是ThreadLocal的作用了。用法如下:
classJavaBean{staticThreadLocal
threadLocal =newThreadLocal
();publicvoid
prepare(){ threadLocal.set(0);}publicvoid
work(){
for(int i =0; i
run(){ bean.prepare(); bean.work();}}publicclassThreadLocalDemo{publicstaticvoid main(String[] args){JavaBean bean =newJavaBean();
for(int i =0; i
從輸出中可以看到,多個(gè)線程操作同一個(gè)threadLocal時(shí),結(jié)果并不會(huì)出錯(cuò)。
可以將ThreadLocal看做是對(duì)Thread.threadLocals的封裝,況且在程序中也是不能直接訪問(wèn)到Thread.threadLocals。
原理
下面簡(jiǎn)單看ThreadLocal的原理,在Thread中保存了一個(gè)Map,類(lèi)型可以認(rèn)為是Map ,其中T是要保存數(shù)據(jù)的類(lèi)型。當(dāng)要從中取出數(shù)據(jù)時(shí),調(diào)用的流程如下:
Thread.currentThread().threadLocals.getEntry(threadLocal).value
這樣,不同的線程在執(zhí)行的時(shí)候在同一個(gè)threadLocal上獲取到的是不同的數(shù)據(jù),線程之間的隔離性是通過(guò)”各自保存不同的Map”來(lái)實(shí)現(xiàn)的,而看到的threadLocal對(duì)象其實(shí)是KEY,在操作前get到的是VALUE。其實(shí)自己動(dòng)手做一個(gè)線程安全的數(shù)據(jù)保存的解決方法也是這個(gè)思路。
在ThreadLocalMap中使用的并不是普通的引用保存數(shù)據(jù),而是使用WeakReference來(lái)做:
staticclassEntryextendsWeakReference
{Object value;Entry(ThreadLocal k,Object v){super(k); value = v;}}
這樣如果ThreadLocal被釋放了,那么ThreadLocalMap中的Entry也會(huì)被釋放,不至于造成內(nèi)存泄露。
網(wǎng)站名稱(chēng):講解一下Java中的ThreadLocal
文章出自:http://fisionsoft.com.cn/article/djeijdo.html


咨詢(xún)
建站咨詢(xún)
