6

今朝、ThreadLocalについて学びました。私はそれが常に最終的で静的でなければならないことを読みました:

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

(セッションはHibernateセッションです)

私の混乱はこれです:それは静的であるため、JVMのどのスレッドでも利用できます。それでも、それにアクセスする各スレッドにローカルな情報を保持しますか?私はこれに頭を包み込もうとしているので、これが不明確な場合はお詫び申し上げます。アプリケーションの各スレッドは同じThreadLocalオブジェクトにアクセスできますが、ThreadLocalオブジェクトは各スレッドにローカルなオブジェクトを格納しますか?

4

3 に答える 3

10

はい、インスタンスは同じですが、コードは、設定時と取得時に、で設定した値を付加するため、メソッドとThread.currentThread()を使用してアクセスすると、現在のスレッド内で値セットにアクセスできます。setget

それは本当に理解しやすいです。

それぞれに、値をインスタンスThreadに関連付けるマップがあると想像してください。ThreadLocalでgetまたはsetを実行するたびにThreadLocal、の実装は、現在の()にThreadLocal関連付けられたマップを取得し、それ自体をキーとして使用してそのマップでまたはを実行します。ThreadThread.currentThread()getset

例:

ThreadLocal tl = new ThreadLocal();
tl.set(new Object()); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.put(tl, [object you gave]) 

Object obj = t1.get(); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.get(tl)

そして、これに関する興味深い点は、ThreadLocalが階層的であるということです。つまり、親の値を定義した場合Thread、子の値からアクセスできるようになります。

于 2012-06-25T17:20:37.170 に答える
2

スレッド固有の値はThreadLocalオブジェクトに保存されませんが、現在のスレッドの値が保存されるためThreadLocalMapです。ThreadLocalオブジェクトは、これらのマップのキーとして機能するだけです。

詳細については、JavaDoc ofThreadLocalおよびサブクラスを参照してください。実装について知りたい場合は、最近のすべてのJDKsrc.zipで利用可能なソースコードを参照してください。

于 2012-06-25T17:34:52.360 に答える
2

特定の問題については常にThreadLocalの同じインスタンスにアクセスしますが、このインスタンスはgetメソッドを呼び出すスレッドごとに異なる値を返します。

それがポイントです。オブジェクトを見つけるのは簡単ですが、各スレッドには固有の値があります。したがって、たとえば、特定の値が2つの異なるスレッドによってアクセスされないようにすることができます。

あなたはそれを(概念的に)HashMap<Thread><V>常にキーとしてアクセスされる種類として見ることができThread.currentThread()ます。

于 2012-06-25T17:20:28.973 に答える