国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

ThreadLocal本地線程變量的理解

2019-11-06 06:22:18
字體:
供稿:網(wǎng)友
        一般的Web應(yīng)用劃分為展現(xiàn)層、服務(wù)層和持久層三個(gè)層次,在不同的層中編寫對應(yīng)的邏輯,下層通過接口向上層開放功能調(diào)用。在一般情況下,從接收請求到返回響應(yīng)所經(jīng)過的所有程序調(diào)用都同屬于一個(gè)線程。        也就是說,同一線程貫通N層,不同的線程可能由于參數(shù)等不同會(huì)對程序中的某些變量進(jìn)行修改,但是又要防止修改后的值對其它線程產(chǎn)生影響,因?yàn)椴煌木€程可以同時(shí)運(yùn)行滴,這就需要我們解決對某些線程共享的變量的訪問沖突問題。ThreadLocal本地線程變量就是一種解決方式,它通過將程序中不安全的變量封裝進(jìn)ThreadLocal中,這相當(dāng)于為每一個(gè)線程提供一個(gè)獨(dú)立的變量副本(其實(shí)是不同的對象),線程修改變量的值對其它線程來說沒影響了,因?yàn)槠渌€程有自己的一個(gè)副本信息。

代碼理解:

// 借助ThreadLocal對象每個(gè)線程只創(chuàng)建一個(gè)實(shí)例public static final String dateFormat="yyyy-MM-dd";PRivate static final ThreadLocal<DateFormat> dfThreadLocal=new ThreadLocal<DateFormat>(){	 @Override	 protected DateFormat initialValue() {		 return new SimpleDateFormat(dateFormat);	 }};public static String dateToString(Date date){	 return dfThreadLocal.get().format(date);}

        對于每個(gè)線程,都有一個(gè)類似于Map的東西ThreadLocalMap(ThreadLocal的靜態(tài)類 ),那它里面保存了什么東東呢,肯定是key-value啊,key就是上面代碼中的共享靜態(tài)變量 dfThreadLocal,value就是DateFormat實(shí)例了,即new SimpleDateFormat(dateFormat)這個(gè)東東。那接下來,在線程內(nèi)我要如何去獲取這個(gè)值呢,就是靠dfThreadLocal.get()實(shí)現(xiàn)滴,方法源碼如下:    
ThreadLocal .ThreadLocalMap inheritableThreadLocals = null ;public T get () {	Thread t = Thread.currentThread ();	ThreadLocalMap map = getMap(t );// 獲取到inheritableThreadLocals	if ( map != null) {		ThreadLocalMap.Entry e = map.getEntry (this);// this作為key,this就是本地線程變量,獲取Entry		if ( e != null)			return ( T)e .value;	}	return setInitialValue ();}ThreadLocalMap getMap (Thread t) {   return t .inheritableThreadLocals;}        可以很明顯的看出,首先根據(jù)Thread.currentThread ()獲取到inheritableThreadLocals(即ThreadLocalMap,他是Thread的一個(gè)變量),然后將this(即最上面代碼的dfThreadLocal對象)作為key(或索引)獲取到真正的值T(就是SimpleDateFormat對象)啊,至此應(yīng)該比較清楚了,為什么不同的線程有各自的值,因?yàn)?不同的線程--->不同的ThreadLocalMap對象(線程的變量)--->通過相同的key(如果有被static修飾)獲取到不同的value值。備注:一般都被static修飾,因?yàn)榭梢员苊庠谝粋€(gè)線程內(nèi)可能發(fā)生的重復(fù)創(chuàng)建TSO(Thread Specific Object,即ThreadLocal所關(guān)聯(lián)的對象),被statis修飾了,同一線程key也肯定一樣,value也肯定只有一份了。        一個(gè)ThreadLocal實(shí)例關(guān)聯(lián)當(dāng)前線程的一個(gè)TSO對象,如果把ThreadLocal聲明為實(shí)例變量,那么每創(chuàng)建一個(gè)類實(shí)例就會(huì)導(dǎo)致一個(gè)TSO實(shí)例誕生,這肯定沒有這個(gè)必要滴。更多文章請見我的個(gè)人博客:http://www.acanblog.com
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 若羌县| 开封县| 新巴尔虎左旗| 司法| 岢岚县| 漯河市| 调兵山市| 玛沁县| 武夷山市| 保德县| 嵊泗县| 金沙县| 专栏| 高尔夫| 内江市| 正阳县| 图们市| 邵东县| 鄂伦春自治旗| 山阴县| 田东县| 会昌县| 齐齐哈尔市| 靖宇县| 木兰县| 射阳县| 大同县| 海安县| 靖江市| 玛沁县| 华容县| 德惠市| 航空| 密山市| 河南省| 洪泽县| 即墨市| 温泉县| 德钦县| 从江县| 从江县|