2012-06-25 16 views
6

今朝ThreadLocalについて学びました。私の混乱がこれですThreadLocalについて混乱しています

(SessionはHibernateのSessionである)

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

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

+3

共有環境に配備されたWebアプリケーションでは、これを使用することに注意してください。スレッドローカルはすべてのコンテキストにわたってリークし、アンデプロイ後にスレッドローカルの参照はガベージコレクションされません。各要求後に手動でデータを削除する必要があります。 – jontro

+0

それは一見矛盾しています。 'ThreadLocal'は各スレッドで一意であるはずですが、静的オブジェクトは各スレッド間で共有されます。この同じ質問をしようとしていた。 – aliteralmind

答えて

10

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

本当に分かりやすいです。

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

例:

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の値を定義した場合、それは子供1からアクセスできるようになりますつまり、階層的であるということです。

+0

ありがとう、これは多くの助けになります。 – badgerduke

+0

あなたはようこそ! –

+0

'ThreadLocal'にマップがあるとします。私はコンセプトを得る。スレッドIDがキーです。一意のインスタンスは値です。したがって、全体的な 'ThreadLocal'オブジェクトは静的であり、スレッドごとに1つの値を保持します。実際には内部マップで実装されていますか? – aliteralmind

2

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

オブジェクトの検索は簡単ですが、各スレッドは固有の値を持ちます。したがって、たとえば、特定の値に2つの異なるスレッドがアクセスしないようにすることができます。

HashMap<Thread><V>のように(概念的に)、それはいつもThread.currentThread()をキーとしてアクセスされます。

+0

ありがとうございます! – badgerduke

2

ThreadLocalオブジェクトにはスレッド固有の値が格納されていませんが、current ThreadThreadLocalMapには値が格納されているためです。 ThreadLocalオブジェクトは、これらのマップのキーとして機能します。

詳細については、JavaDoc ThreadLocalとそのサブクラスを読んでください。または、実装について知りたい場合は、最新のJDKのsrc.zipで使用できるソースコードを参照してください。

+0

ありがとう、これが助けになりました! – badgerduke

関連する問題