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

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


咨詢
建站咨詢
