JAvaマルチスレッド、スレッドプール、スレッド通信、スレッドセキュリティ、同時
3781 ワード
スレッド重点問題:スレッドの作成方式、各種作成方式の優劣 は、Threadを継承し、Runnableを実現する(Callableを実現することとその差は大きくない) の2つのクラスに分けられる. Runnable方式はマルチスレッドを実現する主な方式であり,リソースを容易に共有してリソースを操作できるためである(チケットを購入する例).ThreadはあくまでRunnableのサブクラス です Callableのcallはrunと似ています.違いは、スレッドを実行でき、null以外の戻り値があることです.異常 を投げることもできますスレッドは1回のみstartを呼び出すことができ、複数回の呼び出しは無効であり、setDamonデーモンデーモンスレッドを設定するには、startを呼び出す前に でなければならない.
スレッドプール基本概念:Executor,Executors,ExecutorService,ThreadPoolExecutor Executorは先端インタフェースであり、1つのexecuteメソッドExecutorsを含むExecutorのツールクラスであり、指定されたタイプのスレッドプールインスタンスを取得するための多くの静的メソッドを含む.例えば、newFixed、newCache、newSingleのスレッドプールExecutorServiceはExecutorのサブインタフェースであり、スレッドプールインスタンスクラスはそれを実装することによってインスタンスを取得するため、このようなコード がある.スレッドプール構造には、coreコアスレッド数、max最大スレッド数、queueタスクキューのいくつかの重要なパラメータがあります. スレッドプールのルールは、実行中のスレッド数がcoreより小さい場合、新しいタスクがスレッド実行タスクを直接起動することです.実行中のスレッド数がcore以上である場合は、タスクキューが待機しているタスクで満たされているかどうかを確認します.キューが満たされていない場合は、変更タスクを待機キューに直接挿入します.キューが満たされている場合は、スレッドプールが実行するスレッドの数がmaxに達しているかどうかを振り返ってみます.maxに達していない場合は、スレッド実行タスクを直接起動します.そうしないと、タスクの参加を拒否します. queueには、長さを指定するarray、長さを指定しないlinked、同期問題synchronizedなど、いくつかのblockqueueがありますが、どのようにThreadPoolオブジェクトを構築するかによって異なります.synchronizedのqueue newCacheThreadPoolでは、入力 があることを保証する必要があります.
マルチスレッド通信、スレッドセキュリティ sleep(),wait(),yield()の違い:sleep()はThreadの静的メソッドであり、自分のスレッドがブロック状態になってから準備完了状態に戻るのを一時停止するために使用され、プロセス全体が異常である可能性があるが、他のスレッドとは関係なく、スレッド実行中に含まれるロックオブジェクトを解放しない.wait()はすべてのロックオブジェクトを放棄し、直接ブロックし、Objectクラスの方法であり、スレッド間の調整に使用されます.yield()もTheadの静的メソッドですが、自分をブロックすることなく、自分を準備完了状態に戻して再スケジューリングを待つだけですが、同級/上級スレッドがその前にスケジューリングされ、異常 を捨てないことができます. synchronizedブロック/メソッド、ロック synchronizedは、同期メソッドを使用してオブジェクト向けの考え方に合致し、メソッドをクラスにカプセル化します.同期ブロックを使用するには、開発者が同期プロセスを理解する必要があり、変更が面倒になります.同期メソッドのロックまたは同期モニタは、同期メソッドが存在するクラスオブジェクトであり、 に類似する. Lockはsynchronizedに対して明示的にマルチスレッド同期を実現する問題であり、一般にfinallyブロックにおける 待機割り込み可能:ロックを持つスレッドが長時間ロックを解放しない場合、待機スレッドは 待機を放棄することを選択することができる.フェアロック:申請ロックの順序に従って一度ロックを取得することをフェアロックと呼ぶ.synchronizedは非公平ロックであり、ReentrantLockは構造関数によって公平ロックを実現することができる. 複数のConditionをバインド:複数のnewConditionにより複数のConditionオブジェクトを得ることができ、比較的複雑なスレッド同期機能を簡単に実現することができる.await()、signal();
wait,notify,notifyallの関係は、あるスレッドがロックを放棄するまで、notifyは1つのwait状態がロック対象を待つスレッドを通知するしかなく、notifyallはすべて通知し、すべての待機するスレッドにロックを競合させる.対応するlockオブジェクトのconditionオブジェクトはawait,signal,signalall である. TheadLocalは、各スレッドに存在するリソースのコピーであり、各スレッドは、他のスレッドによって操作結果に影響を与えないように、独自のスレッドでリソースを操作することができます.同期機構はマルチスレッド間でリソースを共有するためのものであり,ThreadLocalはマルチスレッド間でのリソースの共有競合を分離する であるといえる.スレッドセキュリティ集合:一般的にCollectionsクラスに複数の静的メソッド
いくつかのロックの知識
1.主にスピンロック、ブロックロックがあり、再びロックスピンロックに入ることができ、スレッドの状態を変えず、依然としてcpu時間を占有し、他のスレッドがそのサイクル条件を変えるまで無限のサイクルを実行し、スレッドの競争が激しくなく、ロックを維持する時間帯に適用する.同時に非公平ロックであり,lockに入る時間順とは無関係である.種類は、TicketLock、CLHlock、MCSlock、CLHを多用.CLHlockとMCSlockはタイプが似ているフェアロックで、チェーンテーブルの形式でソートされ、CLHのキューは暗黙的なキューであり、実際の後続ノード属性はありません.JUC ReentrantLockのデフォルトの内部で使用されるロックはCLHロックブロックロックで、スレッドの状態を変更してブロックし、ブロックされたスレッドはcpu時間を占有せず、CPu占有率が高すぎることはありませんが、進入時間と回復時間はスピンロックよりやや遅いです.競合が激しくブロックロックを使用すると、再帰ロックとも呼ばれ、同じスレッドの外層関数がロックを取得した後も、内層再帰関数はロックを取得するコードを持っているが、影響を受けないことを意味する.カウントの仕方は、unlockが1回でロックを解除することはなく、カウント回数を見る必要があります
スレッドプール
// pool “ ExecutorService TheadPool ”
ExecutorService pool = Executors.newFixedThreadPool(n);
マルチスレッド通信、スレッドセキュリティ
synchronized(this)
finally{ lock.unlock() }
のロック解除の利点は3つある.tryLock()
new RenentrantLock(boolean fair)
HashMap map = Collections.synchronized(new HashMap())
を持参し、集合オブジェクトのスレッドセキュリティを保証する.また、ConcurrentHashMap(具体的には集合クラスのまとめを参照)では、CopyOnWriteの先頭にある集合クラスCopyOnWriteArrayListは一般的にキャッシュメカニズムに用いられ、読み取りは安全であり、書くときは完全に一致するデータを下位コードでコピーして書き、元のデータに影響を及ぼさないいくつかのロックの知識
1.主にスピンロック、ブロックロックがあり、再びロックスピンロックに入ることができ、スレッドの状態を変えず、依然としてcpu時間を占有し、他のスレッドがそのサイクル条件を変えるまで無限のサイクルを実行し、スレッドの競争が激しくなく、ロックを維持する時間帯に適用する.同時に非公平ロックであり,lockに入る時間順とは無関係である.種類は、TicketLock、CLHlock、MCSlock、CLHを多用.CLHlockとMCSlockはタイプが似ているフェアロックで、チェーンテーブルの形式でソートされ、CLHのキューは暗黙的なキューであり、実際の後続ノード属性はありません.JUC ReentrantLockのデフォルトの内部で使用されるロックはCLHロックブロックロックで、スレッドの状態を変更してブロックし、ブロックされたスレッドはcpu時間を占有せず、CPu占有率が高すぎることはありませんが、進入時間と回復時間はスピンロックよりやや遅いです.競合が激しくブロックロックを使用すると、再帰ロックとも呼ばれ、同じスレッドの外層関数がロックを取得した後も、内層再帰関数はロックを取得するコードを持っているが、影響を受けないことを意味する.カウントの仕方は、unlockが1回でロックを解除することはなく、カウント回数を見る必要があります