ホームページ  >  記事  >  Java  >  ThreadLocal はマルチスレッド プログラムの例を解決します

ThreadLocal はマルチスレッド プログラムの例を解決します

零下一度
零下一度オリジナル
2017-07-26 16:52:431990ブラウズ

読者も、インターネット上で ThreadLocal に関する多くの情報を読んでいると思います。ThreadLocal は、マルチスレッド プログラムの同時実行性の問題を解決するための新しい考え方を提供します。マルチスレッドアクセスの問題を解決します。そう思うなら、ThreadLocal に関するこれまでの誤解を解くために 10 秒ほど時間をください。
JDK のソースコードがどのように書かれているかを見てください:

This class provides thread-local variables. These variables differ from
their normal counterparts in that each thread that accesses one (via its
{@code get} or {@code set} method) has its own, independently initialized
copy of the variable. {@code ThreadLocal} instances are typically private
static fields in classes that wish to associate state with a thread (e.g.,
a user ID or Transaction ID).

翻訳はおおよそ次のとおりです (英語はうまくありません。もっと良い翻訳があればメッセージを残してください):

ThreadLocal クラスは次のようなものを提供するために使用されますスレッド内のローカル変数。この種の変数がマルチスレッド環境でアクセスされる (get または set メソッドを通じてアクセスされる) 場合、各スレッドの変数が他のスレッドの変数から相対的に独立していることが保証されます。 ThreadLocal インスタンスは通常、プライベート静的タイプであり、スレッドとスレッド コンテキストを関連付けるために使用されます。

は 1 つの文に要約できます: ThreadLocal の機能は、スレッド内でローカル変数を提供することであり、そのような変数はスレッドのライフサイクル内で機能し、同じ内の複数の関数またはコンポーネント間でいくつかのパブリック変数を渡す複雑さを軽減します。スレッドを費やします。
たとえば、外出するとき、最初にバスに乗り、次に地下鉄に乗る必要があります。ここでバスに乗るのと地下鉄に乗るのは、同じスレッド内の 2 つの機能です。同じ機能が必要です: バス カード (北京のバスと地下鉄はバス カードを使用します)。バス カード変数を両方の機能に渡さないようにするには (バス カードを常に道路に持ち歩かないのと同じです)、次のようにします。 : バスカードの変更 事前にバスカードを代理店に渡し、カードを通す必要がある場合は、この代理店にバスカードを要求します(もちろん毎回同じバスカードを受け取ります)。このようにして、私(同じスレッド)がバスカードを必要としている限り、いつでもどこでもこの組織にカードを要求することができます。

誰かが言いました: バス カードをグローバル変数として設定できるので、いつでもどこでもバス カードを取得できますよね?しかし、多数の個人 (多数のスレッド) がある場合はどうなるでしょうか?全員が同じバス カードを使用することはできません (バス カードは実名で認証されていると仮定します)。そうしないと混乱を招きます。もう分かりましたか?これは ThreadLocal の設計の本来の目的です。他のスレッドを分離しながら、このスレッド内でいつでもどこでもアクセスできるローカル変数をスレッド内に提供することです。

(1) ThreadContext8742468051c85b06f0a0af9e3e506b5c は、キーと値のペアに基づいて現在のスレッドのオブジェクトをバインドおよびバインド解除するメソッドを提供します。

このクラスはスレッドローカル変数を提供します。 これらの変数は、(get メソッドまたは set メソッドを介して) スレッドにアクセスする各スレッドが独自に初期化された変数のコピーを持つという点で通常の変数とは異なります。

ThreadLocal インスタンスは通常、状態をスレッド (例: ユーザー ID またはトランザクション ID) に関連付けたいクラスのプライベート静的フィールドです。 各スレッドには、スレッド ローカル変数のコピーへの暗黙的な参照があります。

スレッドが生きている限り、1 つのスレッドが終了した後、そのスレッドのすべてのコピーに ThreadLocal インスタンスにアクセスできます。ローカル インスタンスはガベージ コレクションされます (他の参照が存在しない場合)。

8742468051c85b06f0a0af9e3e506b5c はスレッドに保存されたオブジェクトです。つまり、クラスTは、スレッドのクラス属性である。

一般的に使用されるメソッドは次のとおりです。

 1 public class ThreadLocal8742468051c85b06f0a0af9e3e506b5c { 2  3 //设置属性 4  5 public void set(T value) { 6 Thread t = Thread.currentThread(); 7 ThreadLocalMap map = getMap(t); 8 if (map != null) 9 map.set(this, value);10 else11 createMap(t, value);12 }13 14 //获取属性15 16 public T get() {17 Thread t = Thread.currentThread();18 ThreadLocalMap map = getMap(t);19 if (map != null) {20 ThreadLocalMap.Entry e = map.getEntry(this);21 if (e != null)22 return (T)e.value;23 }24 return setInitialValue();25 }26 27 //获取线程的 ThreadLocal.ThreadLocalMap28 29 ThreadLocalMap getMap(Thread t) {30 return t.threadLocals;31 }32 33 }34 35 //新建一个线程本地的localMap36 37 void createMap(Thread t, T firstValue) {38 t.threadLocals = new ThreadLocalMap(this, firstValue);39 }

(2) 使用例: 接続とセッションは次のとおりです。

以上がThreadLocal はマルチスレッド プログラムの例を解決しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。