入研究java.lang.ThreadLocal類_第1頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、入研究java.lang.threadlocal類一、概述 threadlocal是什么呢?其實threadlocal并非是一個線程的本地實現(xiàn)版本,它并不是一個thread,而是threadlocalvariable(線程局部變量)。大概把它命名為threadlocalvar越發(fā)合適。線程局部變量(threadlocal)其實的功用十分容易,就是為每一個用法該變量的線程都提供一個變量值的副本,是java中一種較為特別的線程綁定機制,是每一個線程都可以自立地轉(zhuǎn)變自己的副本,而不會和其它線程的副本矛盾。 從線程的角度看,每個線程都保持一個對其線程局部變量副本的隱式引用,只要線程是活動的并且 thr

2、eadlocal 實例是可拜訪的;在線程消逝之后,其線程局部實例的全部副本都會被垃圾回收(除非存在對這些副本的其他引用)。 通過threadlocal存取的數(shù)據(jù),總是與當前線程相關(guān),也就是說,jvm 為每個運行的線程,綁定了私有的本地實例存取空間,從而為多線程環(huán)境常浮現(xiàn)的并發(fā)拜訪問題提供了一種隔離機制。 threadlocal是如何做到為每一個線程維護變量的副本的呢?其實實現(xiàn)的思路很容易,在threadlocal類中有一個map,用于存儲每一個線程的變量的副本。 概括起來說,對于多線程資源分享的問題,同步機制采納了以時光換空間的方式,而threadlocal采納了以空間換時光的方式。前者僅提供

3、一份變量,讓不同的線程排隊拜訪,而后者為每一個線程都提供了一份變量,因此可以同時拜訪而互不影響。 二、api解釋 threadlocal() 創(chuàng)建一個線程本地變量。 t get() 返回此線程局部變量的當前線程副本中的值,假如這是線程第一次調(diào)用該辦法,則創(chuàng)建并初始化此副本。 protected t initialvalue() 返回此線程局部變量的當前線程的初始值。最多在每次拜訪線程來獲得每個線程局部變量時調(diào)用此辦法一次,即線程第一次用法 get() 辦法拜訪變量的時候。假如線程先于 get 辦法調(diào)用 set(t) 辦法,則不會在線程中再調(diào)用 initialvalue 辦法。 若該實現(xiàn)只返回

4、null;假如程序員希翼將線程局部變量初始化為 null 以外的某個值,則必需為 threadlocal 創(chuàng)建子類,并重寫此辦法。通常,將用法匿名內(nèi)部類。initialvalue 的典型實現(xiàn)將調(diào)用一個適當?shù)臉?gòu)造辦法,并返回新構(gòu)造的對象。 void remove() 移除此線程局部變量的值。這可能有助于削減線程局部變量的存儲需求。假如再次拜訪此線程局部變量,那么在默認狀況下它將擁有其 initialvalue。 void set(t value) 將此線程局部變量的當前線程副本中的值設置為指定值。許多應用程序不需要這項功能,它們只依靠于 initialvalue() 辦法來設置線程局部變量的值。

5、 在程序中普通都重寫initialvalue辦法,以給定一個特定的初始值。 三、典型實例 1、hiberante的session 工具類hibernateutil 這個類是hibernate官方文檔中hibernateutil類,用于session管理。 public class hibernateutil private static log log = logfactory.getlog(hibernateutil.class); private static final sessionfactory sessionfactory; /定義sessionfactory static try

6、 / 通過默認配置文件hibernate.cfg.xml創(chuàng)建sessionfactory sessionfactory = new configuration().configure().buildsessionfactory(); catch (throwable ex) log.error("初始化sessionfactory失敗!", ex); throw new exceptionininitializererror(ex); /創(chuàng)建線程局部變量session,用來保存hibernate的session public static final thr

7、eadlocal session = new threadlocal(); /* * 獵取當前線程中的session * return session * throws hibernateexception */ public static session currentsession() throws hibernateexception session s = (session) session.get(); / 假如session還沒有打開,則新開一個session if (s = null) s = sessionfactory.opensession(); session.set(s

8、); /將新開的session保存到線程局部變量中 return s; public static void closesession() throws hibernateexception /獵取線程局部變量,并強制轉(zhuǎn)換為session類型 session s = (session) session.get(); session.set(null); if (s != null) s.close(); 在這個類中,因為沒有重寫threadlocal的initialvalue()辦法,則首次創(chuàng)建線程局部變量session其初始值為null,第一次調(diào)用currentsession()的時候,線程

9、局部變量的get()辦法也為null。因此,對session做了推斷,假如為null,則新開一個session,并保存到線程局部變量session中,這一步十分的關(guān)鍵,這也是public static final threadlocal session = new threadlocal()所創(chuàng)建對象session能強制轉(zhuǎn)換為hibernate session對象的緣由。 2、另外一個實例 創(chuàng)建一個bean,通過不同的線程對象設置bean屬性,保證各個線程bean對象的自立性。 /* * created by intellij idea. * user: leizhimin * date: 2

10、007-11-23 * time: 10:45:02 * 同學 */ public class student private int age = 0; /年齡 public int getage() return this.age; public void setage(int age) this.age = age; /* * created by intellij idea. * user: leizhimin * date: 2007-11-23 * time: 10:53:33 * 多線程下測試程序 */ public class threadlocaldemo implements

11、 runnable /創(chuàng)建線程局部變量studentlocal,在后面你會發(fā)覺用來保存student對象 private final static threadlocal studentlocal = new threadlocal(); public static void main(string agrs) threadlocaldemo td = new threadlocaldemo(); thread t1 = new thread(td, "a"); thread t2 = new thread(td, "b"

12、); t1.start(); t2.start(); public void run() accessstudent(); /* * 示例業(yè)務辦法,用來測試 */ public void accessstudent() /獵取當前線程的名字 string currentthreadname = thread.currentthread().getname(); system.out.println(currentthreadname + " is running!"); /產(chǎn)生一個隨機數(shù)并打印 random random = new random(); in

13、t age = random.nextint(100); system.out.println("thread " + currentthreadname + " set age to:" + age); /獵取一個student對象,并將隨機數(shù)年齡插入到對象屬性中 student student = getstudent(); student.setage(age); system.out.println("thread " + currentthreadname + &quo

14、t; first read age is:" + student.getage(); try thread.sleep(500); catch (interruptedexception ex) ex.printstacktrace(); system.out.println("thread " + currentthreadname + " second read age is:" + student.getage(); protected student getstudent() /獵取本地線程變量并

15、強制轉(zhuǎn)換為student類型 student student = (student) studentlocal.get(); /線程首次執(zhí)行此辦法的時候,studentlocal.get()絕對為null if (student = null) /創(chuàng)建一個student對象,并保存到本地線程變量studentlocal中 student = new student(); studentlocal.set(student); return student; 運行結(jié)果: a is running! thread a set age to:76 b is running! thread b set

16、age to:27 thread a first read age is:76 thread b first read age is:27 thread a second read age is:76 thread b second read age is:27 可以看到a、b兩個線程age在不同時刻打印的值是徹低相同的。這個程序通過妙用threadlocal,既實現(xiàn)多線程并發(fā),游兼顧數(shù)據(jù)的平安性。 四、總結(jié) threadlocal用法場合主要解決多線程中數(shù)據(jù)數(shù)據(jù)因并發(fā)產(chǎn)生不全都問題。threadlocal為每個線程的中并發(fā)拜訪的數(shù)據(jù)提供一個副本,通過拜訪副原來運行業(yè)務,這樣的結(jié)果是耗費了內(nèi)存

17、,單大大削減了線程同步所帶來性能消耗,也削減了線程并發(fā)控制的復雜度。 threadlocal不能用法原子類型,只能用法object類型。threadlocal的用法比synchronized要容易得多。 threadlocal和synchonized都用于解決多線程并發(fā)拜訪。但是threadlocal與synchronized有本質(zhì)的區(qū)分。synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程拜訪。而threadlocal為每一個線程都提供了變量的副本,使得每個線程在某一時光拜訪到的并不是同一個對象,這樣就隔離了多個線程對數(shù)據(jù)的數(shù)據(jù)分享。而synchronized卻正巧相反,它用于在多個線程間通信時能夠獲得數(shù)據(jù)分享。 synchronized用于線程間的數(shù)據(jù)分享,而threadlocal則用于線程間的數(shù)據(jù)隔離。 固然threadlocal并不能替代synchronized,它們處理不同的問題域。synchronized用于實現(xiàn)同步機制,比threadlocal越發(fā)復雜。 五、threadlocal

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論