代碼理解:
// 借助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
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注