ThreadLocal変数はスレッドローカル割り当てバッファ(TLAB)に割り当てられていると思いますが、そうですか?ThreadLocalはTLABに割り当てられていますか?
TLABに格納されているクラスを正確には何にしているかを示す文書が見つかりませんでした。あなたがいくつか知っている場合は、リンクを投稿してください。
ThreadLocal変数はスレッドローカル割り当てバッファ(TLAB)に割り当てられていると思いますが、そうですか?ThreadLocalはTLABに割り当てられていますか?
TLABに格納されているクラスを正確には何にしているかを示す文書が見つかりませんでした。あなたがいくつか知っている場合は、リンクを投稿してください。
号を参照。各threadLocalには構造体のインデックスがあるため、hashCode()は使用されません。配列を想像し、各ThreadLocalはスロットインデックスを保持します。
スレッドが終了すると、とに参照がなくなり、ThreadLocalsはGCされます。非常に簡単なアイデア。
スレッドを拡張し、参照を保持するフィールドを追加することで、独自のThreaLocalを実装できます。次に、自分のクラスにスレッドをキャストし、データを取得します。
TLABではないので、他のオブジェクトと同様にヒープです。
以前は、データにアクセスするのが非常に遅い静的なWeakHashMapを使用した実装がありました。
Java 1.5、1.6ではどうですか?私はそこで多くのことが変わったと思う。 –
@binary_runner - いいえ変更はありません。言葉遣いは 'as of'(またはsince)です。実際には、最初に、メモリが割り当てられているTLABの発言を理解することができず、スレッドローカルへのさらなる割り当てには全く支障がありません。 ThreadLocalはちょうど非常に普通のJavaオブジェクトであり、魔法はありません(コピーされた継承バージョンを除く) – bestsss
答えはほとんど無関係で、TLABが何であるか誤解しているようです。 gustafcの答えが実際の答えです。 –
これはJVM実装者の裁量に委ねられています。必要に応じてTLABにデータを入れたり、スレッドIDでキーされたグローバルテーブルにデータを置くことができます。 Java言語仕様は、こうした種類の問題については黙っている傾向があり、JVMの作成者はできるだけ多くのプラットフォームでJavaを展開できます。
データそのものは他のメモリ領域にありますが、ポインタはそれだけと思っています。 Javaで各スレッドがマップが保たれているthreadLocals
と呼ばれるフィールドを持っている1.4のとおり:それがどのようにここでhttp://blogs.oracle.com/jonthecollector/entry/the_real_thingとhttp://wikis.sun.com/display/MaxineVM/Threads#Threads-Threadlocalvariables
すべての中小オブジェクトのオブジェクト割り当てにはTLABが使用されています。あなたのThreadLocalは、別々に割り当てられることはありません。
TLABに格納されているクラスを正確に示すものが何であるかを示す文書は見つかりませんでした。あなたがいくつか知っている場合は、リンクを投稿してください。
実は、説明がすぐそこにあなたがlnkedブログ記事である:
スレッドローカル割り当てバッファ(TLAB)単一のスレッドによって割り当てに使用されるエデンの領域です。これは、スレッドがスレッドのトップとリミットポインタを使用してオブジェクトの割り当てを行うことを可能にします。スレッド間で共有されるトップポインタに対してアトミックな操作を行うよりも高速です。
すべてのスレッドは、ヒープの "Generation 0"部分である独自のエデンのチャンクからメモリを割り当てます。ほぼすべてがすべて一定期間TLABに格納されています - おそらくThreadLocal
もありますが、ジェネリックガベージコレクションの後に移動します。 TLABは、メモリを他のスレッドからアクセスできないようにするために、割り当てを高速化するためのものです。あなたがリンクした同じブログのよりアクセス可能な説明はA little thread privacy, pleaseです。
私はすべての答えが正しいと思いますが、私はそれを選択しなければなりませんでした。 –