ThreadLocalのソースで

ThreadLocalのは、一般的にその名が示すとおり、それが唯一の現在のスレッドが、設定を取得、他の操作削除して、それがスレッドGCの終焉となりますすることを意味し、スレッドローカル変数で囲まれています、スレッドローカルとして知られています。

回路図

私たちは、ソースコードを見る前に、私たちは地図を見て

示されるように、各スレッドのスレッドオブジェクトが達成ハッシュマップの簡易版であるThreadLocalMapを含んでいます。だから、当然、ThreadLocalMapは、ハッシュテーブルが含まれています。ハッシュテーブルは、フォーム内のキー/値データに格納されています。キー値が設定したいデータであり、ThreadLocalのインスタンスです。

あなたは、次のような現在のThreadLocalの設定データ、通過します:

threadLocal.set( "置きます");

図1を参照すると、一THREADLOCALに従って(THREADLOCAL現在のインスタンスを識別する)、ハッシュテーブルインデックスの落下位置に基づいて計算されたハッシュコードを含んでいました。

図2に示すように、その後、THREADLOCALキー+データとしてハッシュテーブルのストレージノード上に一緒に格納されていることを特徴とします。

;ノードデータは既に、ノードが右側でない場合、次のノードを見つけるために、右、次にように0のインデックスにリサイクル、および存在する場合は3、

十分なデータ格納場所が存在しない場合は4は、それが膨張し、再ハッシュあろう。

同じGCを回収することを保持引用他の単語がない場合ThreadLocalMapは、内部に記憶された内部スレッドオブジェクトに結合されるので、絶滅ThreadLocalMap参照のスレッドを失うことになる場合、それによってGC、及びThreadLocalMapデータ。あなただけのためThreadLocalMapは雌ねじを閉じ確保し、それを介してアクセスすることができるように、外部に直接ThreadLocalMap、と同じパッケージ内にThreadLocalクラスとスレッドにアクセスすることはできません。

デモ

私たちは、簡単なデモで始まります

ソース決意

 まず、何もドライ工法を持っていた静的なThreadLocal変数を構築

セット()

()メソッドを設定するために行くためにクリック

先获取了当前线程Thread对象,然后从Thread对象里面获取ThreadLocalMap对象。初次调用的话ThreadLocalMap为空,那么进入createMap方法创建一个。

进createMap看看怎么创建的

构造一个ThreadLocalMap的时候,把当前ThreadLocal的实例传入,并把值也传入,看看构造方法

构造方法先初始化了一个空的hash表,然后根据threadLocal的hashCode计算出索引的位置,再以threadLocal作为key创建了一个节点(Entry),设置大小为1,并设置扩容的阈值。这样一个初始化的ThreadLocalMap就构建完了。

我们回到set的时候判断ThreadLocalMap是否为空上来,如果它不为空直接调用ThreadLocalMap的set方法设置值。进入set方法

set方法有点长,原理比较简单。就是先根据threadLocal的hashCode计算出索引位置,然后比对threadLocal对象是不是当前这个对象,遍历整个hash表直到找到对象,或者完全找不到对象。前者直接赋值,后者创建一个节点。创建节点的话会判断需不需要扩容,如果需要的话重新进行hash计算。

get()

看完set方法,再看get方法就显得很简单了

一样是先拿到Thread中的ThreadLocalMap,如果Map为空,那么返回一个初始值。如果不为空,找到Entry节点,如果节点找了返回节点数据,否则返回初始值。

remove()

remove方法,一样很简单

找到ThreadLocalMap,调用remove方法,传入threadLocal实例。进入remove看看

遍历hash表,找到该key对象的Entry,然后做了清理操作。

总结

 ThreadLocal实际上是包含了ThreadLocalMap的数据操作,而ThreadLocalMap组合在Thread中,随着Thread消亡。

 

おすすめ

転載: www.cnblogs.com/lay2017/p/11058285.html