可以看到ThreadLocal類中的變量只有這3個(gè)int型:
ThreadLocal實(shí)例的變量只有 threadLocalHashCode ThreadLocal類的靜態(tài)變量nextHashCode 和HASH_INCREMENT 實(shí)際上HASH_INCREMENT是一個(gè)常量,表示了連續(xù)分配的兩個(gè)ThreadLocal實(shí)例的 threadLocalHashCode值的增量,而nextHashCode 的表示了即將分配的下一個(gè)ThreadLocal實(shí)例的threadLocalHashCode 的值。 而nextHashCode()方法就是將ThreadLocal類的下一個(gè)hashCode值即nextHashCode的值賦給實(shí)例的threadLocalHashCode,然后nextHashCode的值增加HASH_INCREMENT這個(gè)值。
ThreadLocal有一個(gè)ThreadLocalMap靜態(tài)內(nèi)部類,你可以簡單理解為一個(gè)MAP,這個(gè)‘Map’為每個(gè)線程復(fù)制一個(gè)變量的‘拷貝’存儲(chǔ)其中。 看一下set()方法: 獲取當(dāng)前線程的引用,從map中獲取該線程對(duì)應(yīng)的map,如果map存在更新緩存值,否則創(chuàng)建并存儲(chǔ)
再來看一下get()方法: 首先獲取當(dāng)前線程引用,以此為key去獲取響應(yīng)的ThreadLocalMap,如果此‘Map’不存在則初始化一個(gè),否則返回其中的變量。 調(diào)用get方法如果此Map不存在首先初始化,創(chuàng)建此map,將線程為key,初始化的vlaue存入其中,注意此處的initialValue,我們可以覆蓋此方法,在首次調(diào)用時(shí)初始化一個(gè)適當(dāng)?shù)闹担J(rèn)是null
我們來看下ThreadLocalMap靜態(tài)內(nèi)部類,在ThreadLocalMap 內(nèi)部的Entry 是WeakReference
posted on 2011-10-29 17:39 胡鵬 閱讀(1442) 評(píng)論(0) 編輯 收藏 所屬分類: java基礎(chǔ) 、J2EE