Javaのインタビューの質問(4) - マルチスレッド

いくつかの方法がありますJavaのマルチスレッド、。

実装Runnableを実装しコーラブルは、スレッドを拡張します


呼び出し可能と未来、FutureTaskの理解。
呼び出し可能と未来のインターフェイスはjucパッケージの下にあります。
呼び出し可能な、一般的な非同期タスクを実行し、一緒に使用ExecutorServiceの方法を提出することができます。
将来的には、キャンセルジョブをキャンセルして(操作をブロックする)の結果を取得するかどうか、タスクが完了し監視することができます。
FutureTask:
実装のRunnableと未来、その両方の両方の利点。
あなたはどちらかあなたはまた、スレッドを使用することができ、ExecutorServiceのを使用することができます。
 

理解の呼び出し可能と未来。

呼び出し可能と未来のインターフェイスはjucパッケージの下にあります。
呼び出し可能な、一般的な非同期タスクを実行し、一緒に使用ExecutorServiceの方法を提出することができます。
将来的には、キャンセルジョブをキャンセルして(操作をブロックする)の結果を取得するかどうか、タスクが完了し監視することができます。
FutureTask:
実装のRunnableと未来、その両方の両方の利点。
あなたはどちらかあなたはまた、スレッドを使用することができ、ExecutorServiceのを使用することができます。

スレッドプールのプロセスにスレッドを作成するスレッドプールのパラメータは、どのようなものです。

コア引数:
ワークキュー:キューを維持するためのタスクを実行する前に。
keepAliveTimeが:(ナノ秒単位)残業のために待機しているスレッド、アイドルスレッドのコア数よりもスレッドの数。
corePoolSize:アクティブコアの最小プールサイズ残る
maximumPoolSizeを:最大スレッドプール
の方法を作成する:
newCachedThreadPool:
長い治療の必要性、アイドル状態のスレッドを再利用するための柔軟性、そうでない場合はリサイクル可能な、新しい場合よりもキャッシュスレッドプール、スレッドプールを作成スレッド。

newFixedThreadPoolは:
固定サイズのスレッドプールを作成し、あなたが同時スレッドの最大数を制御することができ、余分なスレッドは、キュー内で待機します。

newScheduledThreadPool: 
定期的かつ定期的なタスクの実行をサポートするために、固定長のスレッドプールを作成します。

newSingleThreadExecutor:
すべてのタスクが指定された順(FIFO、LIFO、優先順位)で実行されることを保証するタスクのみワーカースレッドを実行するためにのみ使用し、シングルスレッドのスレッド・プールを作成します。

newWorkStealingPool:
新しいアウト後のJDK 1.8、過度のスレッドプールを防ぐためには、プロジェクトによって引き起こされるCPU使用率過度のダウンタイムを可能にしました。複数のタスクを実行するように構成し、各タスクにはあまり時間がかかります。上記の4つの方法は、高いCPUが起こる占有する可能性があります。

作成プロセス:
1、コアスレッドプールのスレッドがミッションにすべてです、そうでない場合を決定するためには、(コアスレッドがアイドル状態にあるか、スレッドが作成されて何のコアが存在しない)タスクを実行するための新しいスレッドを作成するために取り組んでいます。コアスレッドがミッションにしている場合は、次のプロセスに入ります。

作業キューが満杯でない場合は2、作業キューが一杯であるかどうかを判断するためのスレッド・プールは、タスクが新たに投入されたジョブキューに格納されます。作業キューがいっぱいになっている場合は、次のプロセスに入ります。

ない場合は、タスクを実行するために、新しいワーカースレッドを作成し、スレッドプールのスレッドが動作状態にあるかどうかを判断するために3、。完全な場合には、飽和戦略にこのタスクに対処します。

重要な役割、原則Volitile。

メモリの視認性を確保:
メモリ可視性(メモリ可視性):すべてのスレッドは、共有メモリの最新の状況を見ることができます。
各読み取りの前にメインメモリリフレッシュ日付の値で開始する必要があります。
各書き込みの後すぐにそれらのメインメモリに戻って同期させる必要があります。
並べ替えの指示の防止:
指示を防ぐために、揮発性のキーワードがで並べ替えられ、「メモリバリア。」
揮発性メモリセマンティクスを達成するために、生成バイトコードは、プロセッサ並べ替えの特定の型を阻害する命令シーケンスメモリバリアに挿入されるコンパイラ。
(遅延ロードの場合は、単一の実施形態の場合であり、命令メモリ・モデルは、事前発生転位は、2つのオブジェクトを生成する)
原子性を保証することはできません:
この変数は読み書きする(参照を含む)の原子に限定されている、ことができないカバー変数に対するすべての操作(例えば、カウント++)

https://www.cnblogs.com/monkeysayhi/p/7654460.html

synchronizedキーワード、長所と短所の使用。

使用法:
方法、プロセス、ブロック、オブジェクトのロックに応じ。
長所:
あるスレッド間の同期関係を確保します。
生来の排他的な、再入シンクロナイズド。
ロック後JDK1.6が同期用に最適化されてきた、それは偏ったロック、ロック、軽量、ヘビー級のロックが含まれています。
短所:
ロックを取得するために待機時間を設定する方法が無期限にブロックされた状態でなくなることがあります。
さらに多くの読者が一見同時に実行することができますが、彼らは実際にはまだシリアル、そして最終的には同時パフォーマンスの低下につながるため、少ない読み書きの用途のためには、非常に否定的です。

https://www.jianshu.com/p/d53bf830fa09

はいシナリオを使用しているもの何クラス、達成するためのロックインターフェイス。

「リエントラントロック」を意味ReentrantLockのの実装クラスは、操作がロック中断し取得することができ、ロック取得のタイムアウト時間を設定することができます。
インタフェースReadWriteLockを実装します。読み書きロックが複数のスレッドを同時に実行できますが、書き込みを許可すると同時にスレッドを実行するスレッドを読んでいない、スレッドは書き込みと書き込みの同時実行スレッドに許可されていません。
ReentrantReadWriteLockは、複数のスレッドによるアクセスが許可され読ま同じ時間を読み書き、ReadWriteLockに実装されますが、スレッドへの書き込みアクセス、すべてのスレッドを読んで、他のスレッドがブロックされている書き込み。

公正オプション:より良い公平か不公平よりもスループットのサポート以外の公正性(デフォルト)ロック取得かつ公平な方法、;
リエントラントは:書き込みロック取得後、再入国、再び取得することができますロック取得を読んだ後、再び支援を得ることができます書き込みロックだけでなく、読み取りロックを取得するために、
ロックダウングレード:以下は、書き込みロックを取得し、その後、リードロックを降格することができるように、書き込みロックへの読み取りロックを取得するために書き込みロックを順番を放出します。

https://www.jianshu.com/p/4a624281235e

比較、同期とロック。

ロックは、他のスレッドはいくつかの時間を待っているロックを取得しようとすることができます。コードブロックの同期修正は、ロックを解除するために、実行されます。または実行例外のスレッドが発生し、JVMは自動的に解放し、ロックをスレッドします。
読み取りと書き込み、書き込みと書き込み衝突が起こるが、読んで、読み取り操作が競合しないだろう、ロックあなたはこの操作を同時に行うことができる許可することができます。(読み書きロック)
ロックは、スレッドが正常にロックを獲得している知ることができません。
資源は非常に熾烈な競争している場合は、ロックのパフォーマンスが良くなります。(具体的なシナリオ分析)
sychronizedロック割り込み、ロックを中断されていません。(割り込み可能ロック)
ロックフェアロックが分配ロックロック要求の順序に従って、提供されてもよいです。(フェアロック)
の変数を調整することができ、複数の状態を使用して共有データを監視します。

https://blog.csdn.net/weixin_40255793/article/details/80786249

 

リエントラントロック有用性と実装の原理、コピーライト、読み書きロック、ロックセグメント(におけるセグメントのConcurrentHashMap)のプロセス。

定義:
プログラムやサブルーチンは「いつでも中断され、実行順番に間違って行くことができないサブルーチンを呼び出すコードの別のセクション、に予定オペレーティングシステムは、」可能性がある場合
リエントラント(再入可能または再としてそれを主張しました応募者)の。サブルーチンが実行されているとき、つまり、実行のスレッドを再入力し、それを実行し、することができ
、まだ設計時に予想に沿った結果が得られます。そして、異なるスレッドセーフの複数のスレッドの同時実行は、シングルスレッドの再入力同じルーチン実行上のリエントラント重点がまだ安全です。
原理:
カウンタが0である場合、スレッドカウンタに関連付けられたロックの各ホルダーは、任意のスレッドがロックを取得し、適切なメソッドを呼び出すことができる、ロックがどのスレッドによって保持されていないことを示し、
スレッドが正常に要求します別のスレッドが、それは待たなければなりませんロックケースを要求し;;、JVMは、スレッドがロックを保持し、カウンタは1に設定されて覚えているでしょう
し、再びロックは、ロックを再び得ることができる場合、スレッドはロック要求を保持しますカウンタはインクリメントされ、
スレッドが終了するシンクブロックは、カウンタがデクリメントされたときにカウンタが0であれば、ロックが解除されます。
シーン:
リエントラントロックが主に重要な地域コードを入力する複数のスレッドを必要とし、再入可能ロックを使用する必要があります。
場合特定の例は、別の同期メソッド呼び出しを必要とする上に、このような同期方法が挙げ。
書き込みロック:
アイソクロナス機能シンクロ書き込みロックカスタム依存関係、すなわち、読み書きを同期状態同期。二つの部分に切断整形ライトロック変数、上位16ビットは、下位16ビットが表す書き込み、読み出しを表します。
それぞれの読み書きロック同期ステータスビット演算を計算します。
現在の同期状態がCであると仮定し、それは(0補体符号なし16ビット右シフトビット)の書込み状態C&0x0000FFFF、リード状態c >>> 16です。
状態への書き込み状態は、読み出し状態の増加は、ステータスコードは、C +(1 <<< 16)であり、C + 1を、増加します。
読み取りロックの獲得:
ThreadLocalのスレッドローカルなオブジェクトを、各スレッドはロック解除が他のスレッドには影響しません時にそうすることを、各スレッドの内部にロックを取得し、多くの時間を節約します。 
tryAcquireShared使用がロックを取得するために失敗した後、CASをfullTryAcquireShared。
すべてのスレッドが読み取りロックの数を取得するためのリエントラントロックされ、リードロックの数は、各ロック用のローカル変数が取得した各ロックを保存するため、これにより読取対象を増加させるように最初は、ロック状態読み書きのThreadLocal取得プロセスの難しさ、
前各取得する同期キューに直接リターンを得るために、障害が発生した場合、排他的書き込みロック、排他的書き込みロックが存在するかどうかを決定するために読み取らロック。
いかなる書き込みロックが取得されていない場合、スレッドは、共有ロックの存在による読み取りロックを取得してもよい、それぞれ、種類判別スレッドを取得する、各スレッド獲得同期状態に順番に彼らはその対応するローカル変数に自己増加している場合操作。
獲得の書き込みロック:
ので、読み取りロックの獲得がある場合に失敗し、唯一の現在の読み取りロックがあるかどうかを判断する必要が読み込みロックを取得する前に、ずっと簡単に読み取りロックを獲得するために比べて、書き込みロックを取得
後、現在のスレッドの書き込みロックを取得するかどうかを決定することができます既存の状態値から増加のスレッドが故障ではありません場合はそうでない場合は再入国ロック。
読み書きロックダウングレード:
ロックを読み取りロックする書き込みロックから格下げをダウングレードされます。ケースは、ライトロック処理のロックが、その後ダウングレードを解除され、再び読み取りロックを取得するには、現在のスレッドで書き込みロックを持っています。
ロックセグメント:
。JDK 8の前に、代わりにConcurrentHashMapのロックセグメントハッシュテーブル排他ロック。プラス鎖状構造は、ハッシュマップのアレイを含むながらReentrantLockのセグメントは、ロック機能と、リエントラントロックを継承しました。
8つのセグメントがあるため、以下のロック後にJDKが放棄されている:
無駄なメモリ空間をロックする複数のセグメントを追加します。
生産環境、ロック確率との競争に置かれたときにマップが非常に小さいですが、セグメントのロックは更新や他の操作のための長い待ち時間が発生する可能性があります。
GCの効率を向上させるために。

https://www.cnblogs.com/wait-pigblog/p/9350569.html


ペシミスティック・ロック、オプティミスティックロック、長所と短所、CASは、任意の欠陥を持って、解決策は何ですか。

楽観的ロックは:
それはロックされませんので、それを読み、少なく同時変更を書いて、他の人には、データを取得するたびに変更されることはありませんことを。
更新時間は、このデータが更新されていないかどうか確認します。具体的な戦略の更新前に、現在のバージョンを取得する、ことです
、その後、バージョン番号と最後を比較し、同じを更新し、それが失敗した場合には読み繰り返す必要があります-比較-書き込み操作を。
用途:ロックAQSの枠組みの中では少ない、などRetreenLockとして、悲観的ロックに変換されます取得し、楽観的ロックロックCAS取得する最初の試みです。
ペシミスティック・ロック:
悲観的ロックそれ以上の書き込み、およびより多くの同時変更は、データを取得するたびに他の人がロックを取得するためにブロックされるまで、データを読み書きすることになるでしょう、ロックされること。
用途:同期
CASの利点:
、資源競争力の弱い状況性能の軽量楽観CPU命令によるロック、および高を非ブロック
より複雑なロック、ロック解除およびウェイクなり、同期、同期ロックの重量と比較操作。
CASの短所: 
1. ABAの問題。前バージョンAは、中間A-> B-> Aによって更新され、この時間は更新されていないスレッドを取得するために更新されます。
AtomicStampedReference原子Javaクラスは、制御変数値のバージョン番号は、CASの正確さを確保します。
最良のソリューションバージョン番号が変数の前に追加され、各変数が場合、バージョン番号またはタイムスタンプを加えた1つの更新され、
その後、Aは、 - B - Aとなる(a) - (b) - (a)
2.スピン時間は、長すぎますリソースは、リソースの競争力の高い、マルチスレッドスピン長く消費されている場合は、CPUリソースを消費します。

https://blog.csdn.net/qq_20499001/article/details/90315061


アンフェアロック、フェアロックの違い。


緯度ロックのマルチスレッド実行順序は、株式及び非株式ロックにロックされます。
フェアロック:スレッドがあるかどうかを確認するために待機する前にロック、任意の優先順位のスレッド上面には、最初に務めた最初に来ます。
アンフェアロック:応答がない場合はロックされたときにロックを取得するためにCASダイレクト試みたら、
その後、いったん判断(ロックがフリーであればtryAcquire法、ダイレクトアクセス)は、テールキューを行くために取得できませんでした。
ReentrantLockのは、2つのロックをサポートしています。
ReentrantLockの公正tryAcquire方法注:
ドゥの..フェアtryAcquireバージョンではない再帰このIS NOまずウェイターやない限り、通話やアクセス権限の付与ザ・
tryAcquireの公正バージョン。それは、再帰的に呼び出されていない、または全くウェイター、そうでない場合はアクセスを許可されていない場合を除き。
アンフェアtryAcquire方法注:
。実行不公平のtryLock tryAcquireは、サブクラスで実装されますが、のtryLockメソッド不公平両方-必要性、試してみるためのものです。
非株式のtryLockの実行。tryAcquireは、サブクラスで実装されているが、両方の不公正な方法には、ニーズをのtryLockしようとします。
違いはtryAcquireは、現在のスレッドの前に何のスレッドが、唯一のCASになることはできませんことを保証するために、状態= 0(基準ロック0)、非株式ダイレクトコールCAS、および公正なロックを決定していることである。
使用:
非のより直接的な使用フェアロック; 5〜10倍高い公正性能より不公平ロックロック、公平性を維持する必要性は、マルチコアの場合にキューをロックしているため、
現在のスレッドがない場合には最初のキューは、ロック、スレッド切り替え時間の増加を得ることができません。

https://www.jianshu.com/p/2ada27eee90b
http://www.cnblogs.com/darrenqiao/p/9211178.html


バイアスされ、ロック区別軽量ロック、スピンロック、ヘビー級のロック。


スピンロック:
あなたは非常に短時間でロックリソースを保持する場合は、ロックを解除することができ、他のスレッドはちょうど分(スピン)を待って、ブロックされた状態を入力する必要はありません、
そして他のスレッドがすぐにロック取得後にロックを解除します。ユーザーとカーネルスレッド間の切り替えを消費し、この回避できます。
スピンは、CPUを消費する必要がある、あなたは、スレッドがブロックされて入る時間をかけて、スピン時間を設定する必要があります。
長所:
削減のスレッドがブロックされ、次の競争は熾烈ではないため、ロック、ロック時間を保持することは非常に短く、パフォーマンスはあまり改善されている、スピン
CPUの消費量は、スレッドが目を覚ますその後、ブロックされ、より小さい(スレッドコンテキストの切り替えが2回出現する)
短所:
もしマルチスレッドリソースの競合、および長時間ロックを保持しているスレッドは、その後、スピン・ウェイト・CPUの消費量は、あるべき
スレッドブロックは、CPUの無駄が生じ、再び目を覚ます消費よりも大きいです。
スピンロックしきい値を設定した時間:
適応スピンロックスピン時間の導入後JDK 1.6が固定されていない、
しかし、同じ前のスピンロック時間によって、およびのロック所有者状態が決定します。
基本的な考え方スレッドコンテキストスイッチの時間は最高の時間です。
JVMの最適化:
平均負荷<CPUの数は、スピンがされている場合は
、CPU / 2スレッドの数を超えて回転している、直接、後でブロックされたスレッド
あなたが所有者のスピンスレッド発見された場合には、スピン遅延時間を(変更しますスピンカウント)またはブロックに
CPUモードを省電力である場合には、スピン停止し
、データを記憶するCPU(CPUに格納されたスピン最悪の場合の時間遅延をその直接データのCPUのB)までの時間差
スピンときにスレッドの優先順位との差を放棄することが適切であろう
JVMによってJDK7スピン制御パラメータの後に

偏ったロック:
ロックフラグ01は、
その名の通り、それは、最初のアクセスにロック・スレッドを傾向があり、ロックする傾向が
動作中の場合は、唯一のスレッド同期ロックへのアクセスを、プラスそれは偏ったロックしているスレッドを与える、あなたは再び訪問する必要はありません。 CAS。動作時に、ロックをつかむために、他のスレッドに会った、中断される保持しているスレッドをロック付勢場合、JVMは、その本体付勢ロック、標準軽量ロックにロック戻しますがなくなります。
プロセス:
01として同定されて付勢ロッキングのマークWordは、ロック付勢されています。
現在のスレッドのスレッドIDの状態がバイアスされる場合、複数のアクセスポイント。
もしそうならない場合は、直接同期は、スレッドにチェックID・ポイントは生きています。
あなたがハングアップした場合、新しいスレッドがロックバイアスを保持している、そうでない場合、アップグレードは軽量ロックである(CASマークWordが失敗した交換してください)。
バイアスされたロックは、最初に撤退し、その後、アップグレード、STWの失効につながるだろう。

軽量ロック:
ロックフラグ00
の軽量ロックはロックへのアップグレードによってバイアスされています。
これは、2つのスレッドが交互軽量ロックであるロック・スレッドまたは他のスピンロック時間閾値を取得得ることをいいます。
この時点で、マークのWordは、現在のスレッドのスタックフレームを指します。
時間がブロックされ、軽量ロックに別のスレッドに、しきい値リードを超える場合はヘビー級ロックにアップグレードリリースされます。

ヘビー級のロック:
ロックフラグ10
ヘビー級ロックが来る軽量ロックからアップグレードされました。
同じロックに対して競合する複数のスレッド。
この時点で、マーク・ワードは、ヘビー級ロック・スレッドのスタックフレームを保持するために指しています。
ヘビー級のロックは同期:
尾の要素、JVMのための競争を減少させるために、JVMは、ロック競合候補(OnDeck)のキューの末尾からデータを取り出しますが、同時実行は、ContentionList CASは、同時実行スレッドの数が多いためにアクセスされますそれはするentrylistスレッドを競合候補としてねじの部分に移動されます。ロック解除で所有者スレッド、するentrylistに一部のスレッドの移行でContentionListとするentrylist内のスレッドを指定します(そのスレッドに行くには通常、最初の)OnDeckスレッドです。所有者スレッドはOnDeckスレッドロックに直接渡すことはありませんが、ロック競合の権利は再ロック競合にOnDeck、OnDeckの必要性を手渡しました。この犠牲いくつかの公正さが、しかし大いにJVMで、システムのスループットを向上させることができ、また、この動作を選択するために、「競争力のスイッチを。」
リソースの後にロックを取得するためにOnDeckスレッドが所有者スレッドになり、それでもにするentrylistで立ち往生ロックリソースを取得できませんでした。スレッドが所有者waitメソッドをブロックされている場合は、通知することによって、特定の瞬間までWaitSetキューに転送したりのnotifyAllが目覚め、するentrylistに再び移動します。
シンクロナイズド非公正ロック。スレッドで同期がContentionListに入る、あなたは明らかにスレッドのキューに入っているContentionList、入ることができない場合、ロックスピンを取得しようとしたスレッドを待って公平ではない、不公平なことはスピンを取得することでありロック・スレッドは、直接リソースがロックOnDeckスレッドをつかむすることがあります。
ContentionList - >するentrylist - > OnDeck - >所有者 - > WaitSet - >するentrylist(待機后回到するentrylistに通知)

https://blog.csdn.net/zqz_zqz/article/details/70233767
https://blog.csdn.net/tian251yu/article/details/80638104

 

ABC 3つのスレッドに実行順序を確保する方法。


フェアウエイロック:
ReentrantLockのロックのReentrantLockの新しい新=(真の)の;
Lock.lock();
BlockingQueueの方法:
)LinkedBlockingQueue新しい新しい= LinkedBlockingQueueキュー(;
queue.put();
queue.poll();


スレッドの状態はどのようなものです。


新(新):新しいスレッドオブジェクトを作成しました。
レディ(Runnableを):スレッドが作成された後、startメソッドを呼び出します。スレッドはCPUのみを使用する権利を待って、「実行可能なスレッドプール」に存在しています。
(実行)実行:、準備スレッドのCPUを取得し実行します。
ブロックされた(ブロック):何らかの理由で、使用するCPU、一時停止する権利を放棄する(waitメソッドを呼び出す)ためのスレッドを実行している
スレッドは(メソッドを通知するコール)準備状態に目覚めるまで、実行する機会を持っています。


https://www.cnblogs.com/jijijiefang/articles/7222955.html

睡眠と待ち時間の違い。


睡眠は、waitメソッドは、Objectクラスで、Threadクラスのメソッドです。
睡眠は、waitメソッドは、ロックを解除し、ロックを解除していない、待機スレッドの再入力ブロックされたスレッド・プールを
他のスレッドの呼び出しが通知されるまで/レディ状態に入るのnotifyAll。
それは自動的に目を覚ますように、スリープ(ミリ秒)以下の割り込みよりも()強制的に中断された場合にのみ呼び出すことができ、時間を指定することができます。
ロールのThread.sleep(0)は、「オペレーティングシステムがすぐに再CPUの競争をトリガー」です。

https://www.cnblogs.com/plmnko/archive/2010/10/15/1851854.html


違いは、通知とのnotifyAll。

(通知する通知とのnotifyAllの間の主な違いは)のみのnotifyAllメソッドは、すべてのスレッドを覚醒し、スレッドを起こします。
実際には、すべてのオブジェクトは、ロックプール(のentrySet)及び(WaitSet)を待っている2つのプール、プールがあります。

ロックプール:場合は、スレッドので、スレッドがロック、ロックが既に占有されているので、他のスレッドBのニーズは、(例えば、同期修飾法又は同期修正されたコードブロックを実行する必要性を呼び出す必要のような)ロックを取得するために、この時間を獲得しましたBのみがロックを待つことができ、この時間スレッドBは、ロックロックプールに入ります。
プールを待っ:スレッドがロックを取得した後、条件の数を満たす(例えば、プロデューサーコンシューマープロデューサー取得したロックモード、およびキューが満杯であると判断)しない場合、コール待機メソッドは、オブジェクトのロックを必要とすることが想定され、スレッドをロックを放棄し、プール待ちのロックを入力します。
他のスレッドがある場合は呼び出すnotifyメソッドのロックはプールにこのスレッドをロックし、一定のアルゴリズムに従って待機プールからスレッドを選択します。
他のスレッドの呼び出しのnotifyAllメソッドロックがある場合、それは、プール内のすべてのスレッドのロック、ロックの競争にすべてのプールをお待ちしております。
違いロックプールとプール待機:待機中のプールのスレッドがロックを獲得することはできませんが、プールに目覚めるようにするロックのニーズは、ロックを獲得する機会を持っています。

https://blog.csdn.net/liuzhixiong_521/article/details/86677057


ThreadLocalの理解、実装の原則。

スレッド(スレッド)のローカル変数を提供THREADLOCAL、変数にアクセスするには、各スレッドは、独自のローカル変数を持っています。
ThreadLocalのを作成するときに、各オブジェクトは、ThreadLocalMapを持っているスレッドと、彼らは価値がどのタイプにすることができ、キーはThreadLocalのあるマップにThreadLocalのオブジェクトを追加します。

https://www.jianshu.com/p/ee8c9dccc953

公開された115元の記事 ウォン称賛58 ビュー23万+

おすすめ

転載: blog.csdn.net/Angry_Mills/article/details/82107312
おすすめ