「Javaの並行プログラミングの芸術」ノート

コンテキスト切り替えを減少させる方法:P3
1、ノーロック並行プログラミング;
2、CASアルゴリズム;
3、最小限のスレッドを使用して
コルーチンを使用して4、。

一般的なデッドロックを回避する方法:P6
。ロックを取得同時に複数のスレッドを回避する1;
複数のスレッドを避けるために2は、同時にロックのリソースを占有し、ロックが一つだけのリソースを占有していることを確認しようとし、
3時間ロックを使用しようとすると、使用しますlock.tryLock代わりに内部ロック機構を使用する(タイムアウト);
4、データベースロックのために、ロックおよびロック解除するデータベース接続である必要があり、そうでない状況、障害が発生しロックを解除します。

アトミック動作のプロセッサ実装方法:P17
。1、アトミック性を保証するためにバスで第1のロック機構;
2、アトミック性を保証するキャッシュによって第2のロック機構。

Javaのアトミック操作の実装:P18
。1、アトミック操作を達成するためにCASサイクルを用いて、
図2に示すように、ロック機構の不可分。

スレッド間通信機構:共有メモリとメッセージパッシング、P21の

JMM:Javaのメモリモデル、P22

カテゴリ並べ替え:P23
。1、コンパイラの最適化は、並べ替え、
2を、並行して命令のセットを並べ替える;
3、メモリシステムの並べ替えと、

シーケンシャル一貫性メモリモデル特性:P32
1、全ての動作中のスレッドは、プログラム順序で実行されなければならない;
2、(かかわらずかどうかプログラム同期の)すべてのスレッドのみが実行される動作の単一のシーケンスを見ることができます。シーケンシャル一貫性メモリモデルでは、各動作が実行されなければならず、すべてのスレッドに原子直ちに目に見えます。

コンカレントプログラミング・モデルの分類:P24
。1、シーケンシャル一貫性メモリモデル;
2、Javaメモリー・モデル。

特性揮発性変数:P39
1、視認性;
2アトミック; ++なし原子揮発性を有していません。

スレッド間のJava通信:P54
。1、書き込み揮発性変数をスレッド、スレッドBは、揮発性の変数を読み出し、
図2に示すように、スレッドBとの書き込み揮発性変数スレッドは、次にCAS揮発性の変数を更新する;
3、CASとのスレッドA。揮発性変数を更新し、CASと、スレッドBは、この揮発性変数を更新;
4、CAS揮発性変数の更新とのスレッドは、スレッドBは、揮発性変数を読み出します。

Javaの线程状态:P87
、新しい実行可能な、ブロックされ、waitting、time_watting、終了。

非DaemomスレッドがJava仮想マシンを存在しない場合は、Java仮想マシンが終了します。Daemomスレッドを構築するときに、Java仮想マシン出口Daemomスレッドがfinallyブロックが実行されません場合は、あなたは最終的にロジックがシャットダウンまたはリソースをクリーンアップすることを確実にするためにブロックの内容に依存することはできません.P91

P92:多くのステートメントは、これらのメソッドは、クリアするためにスレッドフラグを中断するInterruptedExceptionある、Java仮想マシンを投げる前に(例えばのThread.sleep(長いミリ)メソッドなど)InterruptedExceptionある方法をスローし、その後例外:InterruptedExceptionをスローします。

P95:呼び出し後、スレッドが(ロックなど)既に占有リソースを解放しません()メソッドを一時停止しますが、リソースの占有者は、簡単に眠りにつくデッドロックにつながります。スレッドは、通常のリリースである資源を保証するものではありません、スレッドの終了時に()メソッドを停止し、スレッドは通常ので、不確実性の下かもしれないプログラムを引き起こし、作業のリリースリソースを完了する機会が与えられていません。

セキュリティ・スレッドを終了する:P95
1、割り込みステータスを、割り込み();
2、ブール変数を制御します。

別のスレッドオブジェクトO Bのコールは(通知ながら物体O待ち()メソッドは、待機状態に入る呼び出しAは、スレッドを参照)またはのnotifyAll()メソッドの後、通知されたスレッド:通知メカニズム(P99)/待ちます()メソッドは、待機からオブジェクトを返し、さらに後続の操作。

待機()を呼び出し、(通知)のnotifyAll() P100:注意すべきである
1、(ウェイトを呼び出し)、(通知)のnotifyAll() ;最初のオブジェクトをロックするために呼び出す必要があり
ました2、待機()メソッドを呼び出し、スレッドの状態; waittingが実行なり、対象キューに現在のスレッド
)3、notify()あるいはnotifyAll()メソッドは、(まだスレッドを待たずに、後に呼ばれる)(呼び出し通知、待機から復帰)またはのnotifyAll(。スレッドは、待機からチャンス()リターンのスレッド待機する方法のロックを解除する;
4、通知()メソッドは、キュー同期キューからキューに移動待機待機中のスレッドを待ち、のnotifyAll()吸引ウエイトすべての同期キューからキュー移動待機キューで待機しているスレッドは、状態は、スレッドプログラミングがブロックwaittingによって移動される;
。5、待機から()メソッドは、前提は、呼び出しオブジェクトロックを取得することである戻ります。

パイプライン入力/出力ストリーム:P102の
培地1、メモリの送信との間のデータ伝送のためにメインスレッド;
2、実装:持つPipedOutputStream、持つPipedInputStream、pipedReader、PipedWriter 、 最初の2バイトのために、後者の2つの文字指向;

Thread.join():P103
。1、意味:のみ()は、現在のスレッドが終了Thread.join後スレッドからスレッドを待機返し、
2、

ワーカースレッドが連続的に作業キューの仕事から取り外されている間、復帰後の作業キュータスクにスレッドセーフな作業キューワーカースレッドと接続のクライアントスレッドの使用、クライアントスレッド:プール(P114)自然スレッドそして、実行。作業キューが空の場合、すべてのワーカースレッドは、多数のタスクが提出されているとクライアントのスレッドは、任意のタスクワーカースレッドに多くの労働者が通知を提出したがある場合、作業キューで待機していますスレッドが目覚めされます。

ロックインタフェース:P120の
特性:P121
1ロックを取得するために、非ブロックしようと、現在のスレッドがロックが正常にロックを取得し、保持する他のスレッドを取得する時間はない場合、ロックを取得しようとする;
2、中断ロックを取得することができます;ロックが解除されている間、割り込み、取得したスレッドが中断されたロック時に、割り込みが発生しますに対応するためにロックを取得することができます異なるスレッドと同期。
3、タイムアウトがロックを取得するステップと、期限がまだ返されるロックを取得できない場合、おそらく、指定された期限前にロック。

キュー同期(AbstractQueuedSynchronizer)P121。

P122:テンプレートは、分類を同期させる方法を提供する
。排他的な取得のように、1との同期状態を解除;
2、共有取得し、同期状態を解除する;
3、キュー待ちクエリスレッド同期。

Javaクラスアトミック操作:は、java.util.concurrent.atomicパッケージ(以下原子パケット)P182
1、アトミック更新タイプ:P182。
1)基底クラス原子P182を更新する;
A)AtomicBooleanは:ブールアトミック更新;
B)のAtomicIntegerの:アトミック更新全体タイプ;
C)AtomicLong:更新原子長い整数;
2)配列原子P184を更新する;
A)AtomicIntegerArray:アトミック更新整数アレイ要素;
B)AtomicLongArrayの:更新原子長整数配列要素;
を有するC)AtomicReferenceArray:アトミック;要素の参照型の配列を更新
3)参照原子P185を更新する;
A)AtomicReference ,:参照型原子を更新し;
B)AtomicRefererceFieldUqdate:参照フィールドの原子更新タイプ;
C)AtomicMarkableReference:アトミック更新タイプの参照フラグ。
4)更新プロパティ原子P187;
A)AtomicIntegerFieldUqdat:アップデータを整形アトミック更新フィールド;
B)AtomicLongFieldUqdat:アトミックアップデート長フィールド整形更新;
C)AtomicStampedReference:参照型のアトミック更新バージョン番号。

ロックを書く:ReentrantReadWriteLockを有する
。1、、ロックはロックを維持書き込み読み込みロックと書き込みロックを含む、P140
2を、書き込みロックは排他ロックを再入力である; P143;
3、読み取りロックは、重量を支持されています。共有ロックを入力してください; P144
4、ロックダウングレード:ロック降格を読むために書き込みロックを指し、(現在所有している)、ロックを書きで取得するためにロックを読んで、その後、(いずれかを保持する前に)書き込みロックを解除するのに保持するために指し、プロセス。P145

LockSupport:P146
1、現在のスレッドの行をブロックするために使用されるメソッドのセット、およびunparkを(スレッドスレッド)スレッドをウェイクするための方法を定義公園LockSupportの開始時には遮断されます。


オブジェクトモニター方法:P147
待機()、待機(ロングタイムアウト)、通知()、のnotifyAll();

条件:P148
ロックオブジェクトの1、条件依存性;
2は、最初のメソッドを呼び出す前にロックを取得:Lock.lock()と、
図3に示すように、ロック(同期)は、同期キュー待ち行列を複数有している;
4、条件を実現しています内蔵型同期、各インスタンスは、基準状態に対応するそれぞれのシンクロナイザを属している同期方式によって提供条件にアクセスすることができます。

ConcurrentHashMapの:P155スレッド安全で効率的なHashMapの
1は、HashMapの上の理由同時実行のP155を使用していない:100%に近いCPU使用率で、その結果、無限ループが発生します置く行為をすることHashMapを使用して、マルチスレッド環境では、同時実行ではありませんHashMapを使用しています。HashMapのマルチスレッドのエントリーリストのデータ構造の原因は、リングのデータ構造は、一度、次のノードのエントリは決して空に形成され、環状を形成するために、無限ループがエントリを取得生成されますので、無限ループを引き起こす可能性があり、操作を置くHashMapの並行して実行すると、
図2に示すように、ハッシュテーブルP156:ハッシュテーブルはセキュリティ・スレッドを確保するために同期使用して、非常に非効率的なハッシュテーブルの激しい競争の中で糸;
3、ConcurrentHashMapのP156の:セグメント技術によるロックは、効率を改善するために、
1)構造とHashEntryのConcurrentHashMapのセグメントアレイで構成されています。構造体の配列;
2)セグメント:リエントラントロック; HashEntry:鍵データを記憶する。
ConcurrentLinkQueue:P161スレッドセーフキュー
1、ConcurrentLinkQueueリンクノードに基づく、アンバウンド形式のスレッドセーフなキュー、FIFOルールを使用してミシェル&スコットアルゴリズムにいくつかの変更を加えたアルゴリズムを実装するために、「待っフリー」アルゴリズム(すなわちCASアルゴリズム)を使用して、ノードを並べ替える;
2、P162は、キュー:キューはキューの末尾にエンキューノードを追加することです。
キューは、主に2つのことを行う:
1)ノードは次のノードのキューテール電流ノードをエンキューするように配置されています。
2)次のノードテール・ノードが空でない場合、次のノードのテール・ノードが空であるならば、チームはテール・ノードのノードに設定され、その後、チームノードが次のノード尾に配置され、テール・ノードを更新するので、テール・ノード必ずしもテールノード;
3、キューP165は:キューからノード要素を返し、空ノード対の要素への言及は、
のキューP167をブロック
1は二つのブロッキングキューは、キュー・サポートの追加操作です。挿入および除去方法の動作を遮断する二つの追加の支持体;
2、Javaはキューレーン7ブロッキング:P168を
1)ArrayBlockingQueueを有する:構造体の配列は、キューをブロック境界、FIFO;
2)LinkedBlockingQueue:A境界ブロッキングキューからなる連結リスト構造と、FIFO;
3)PriorityBlockingQueueは:支持優先無制限ブロッキングキュー、取得遅延支持要素、
4)DelayQueue:プライオリティキューの実装無制限ブロッキングキューを使用して、
5)SynchronousQueue:記憶ブロッキングキュー要素;
6)LinkedTransferQueue:リンクされたリスト構造からなるからなる無制限ブロッキングキュー;
7)とLinkedBlockingDeque:双方向ブロッキングキューからなるリスト構造、
フォーク/フレームP175に参加:java7設けられています並行してタスクを実行するためのフレームは、タスクへの大きな課題は、各小タスクの後にタスク結果の大きいフレーム最終合計結果を得るために、小さないくつかに分割されています。
1、ワークスチールアルゴリズムP176:実行するために他のタスクから盗まれたスレッドキュー、通常は両端キューを指し、タスクスレッドはヘッド両端キューから盗まれた権限を取得することはありません、タスクのスレッドは、両端から盗むことはありませんタスクの実行を取るためにキューの末尾。
図2に示すように、アレイのForkJoinPool PorkJoinTaskとForkJoinThreadによってアレイ、プログラムのアレイのForkJoinTask責任ストアForkJoinPoolタスクに提出され、これらのタスクを実行するためForkJoinThreadアレイ責任; P179
3、

Javaツールの同時実行:
1、P189たCountDownLatch:たCountDownLatchが終了する他のスレッドを待っている1つまたは複数のスレッドを許可する;
2、CyclicBarrierをP191:文字通り(巡回)障壁(バリア)リサイクルされ、それが行われる必要がありますスレッドのグループは、(また、同期ポイントと呼ばれる)の障壁は、それが最後のスレッドがバリアに達するまでの時に、バリアがドアを開けますブロックされ、ブロックするすべての障壁を実行し続けます到達できるようにすることです;
3差たCountDownLatchとCyclicBarrierをP195:たCountDownLatchカウンタは一度だけ使用することができ、かつリセットするCyclicBarrierをカウンタリセット()メソッドを使用してもよいです。したがってCyclicBarrierをより複雑なビジネスシナリオを処理することができ、
4、P196セマフォ:セマフォ(セマフォ)が公共資源の適切な使用を確実にするために、さまざまなスレッドの調整によるもので、同時に特定のリソースにアクセスするスレッドの数を制御するために使用される;
5、交換。ツールは、スレッドP198間でデータを交換:交換器は、スレッド間のデータ交換のために、スレッド間のコラボレーションのためのユーティリティクラスである;
1)データを交換するための糸交換方法であって、最初の実行スレッド交換することで、第二のスレッドになるまで待機しますまた、交換を行い、
スレッドプール:

Executorのフレーム
1、タスク。; P209呼び出し可能、または、Runnableインタフェースは、インタフェース含む
2、ミッション。どのように多くのエグゼキュータの実装コアタスクを含むメカニズムと同様に、エグゼキュータExecutorServiceのインタフェースから継承されました。二つのキーExecutorServiceのクラスは、インターフェイス(ThreadPoolExecutorとのScheduledThreadPoolExecutor)を実装し;
3、非同期計算結果。これは、インタフェースと実装FutureTask未来フューチャー・インターフェース・クラスを含み;

エグゼキュータフレームワークメンバー:P211 ThreadPoolExecutor、ScheduledThreadPoolExecutorの、将来のインターフェース、インターフェースRunnableを、呼び出し可能インタフェースとエグゼキュータ。
1、ThreadPoolExecutor:P211 ThreadPoolExecutorは、通常、ファクトリクラスエグゼキュータを使用して作成され、
1)FixedThreadPool:スレッドの固定数を使用。資源管理の必要性、および重いサーバー負荷のために現在のシナリオのスレッドの数を制限する必要性を満たすために適用するために。
ExecutorServiceのnewFixedThreadPool静的パブリック(nthreadsの値INT);
パブリック静的ExecutorServiceのnewFixedThreadPool(nthreadsの値INT、ThreadFactory threadFactory);
2)SingleThreadExecutor:単一スレッドを使用して。各タスクの順序の実施を確保するために適用するには、時間の任意の時点で、複数のスレッドがアクティブなシーンがあるのだろう。
ExecutorServiceのnewSingleThreadExecutor静的パブリック();
パブリック静的ExecutorServiceのnewSingleThreadExecutor(ThreadFactory threadFactory);
3)CacheThreadPool:必要に応じて新しいスレッドを作成します。CacheThreadPoolは、非同期タスクが比較的軽いまたはサーバーに接続されている、小型の短期プログラムの多くを実行するために無制限のスレッドプールサイズです。
ExecutorServiceのnewCacheThreadPool静的パブリック();
パブリック静的ExecutorServiceのnewCacheThreadPool(ThreadFactory threadFactory);
2、のScheduledThreadPoolExecutor:典型的にエグゼキュータを作成するために使用されるのScheduledThreadPoolExecutor P211ファクトリクラス;
1)のScheduledThreadPoolExecutor:スレッドの固定数を作成します。リソース管理のニーズを満たすために、ユーザーのシナリオで、バックグラウンドスレッドの数を制限するために、バックグラウンドタスクを実行するために複数のサイクルを必要とするアプリケーションの場合。
静的ScheduledExecutorSevice newScheduledThreadPoolExecutor公開(INT corePoolSize);
パブリック静的ScheduledExecutorSevice newScheduledThreadPoolExecutor(INT corePoolSize、ThreadFactory threadFactory);
2)SingleThreadScheduledExecutor:スレッドの固定数を作成します。定期的なタスクを実行するために、単一のバックグラウンドスレッドを必要とするアプリケーション、およびさまざまなシナリオのタスクの順序の適用と実装の点を確認する必要があるため。
パブリック静的ScheduledExecutorSevice newSingleThreadScheduledExecutor();
ScheduledExecutorSevice newSingleThreadScheduledExecutor静的パブリック(ThreadFactory threadFactory);
3、将来のインターフェース:P222将来今後のインタフェースとインタフェースクラスの実装では、結果FutureTask非同期計算を決定します。
<T>将来<T>送信(呼び出し可能<T>タスク)
<T>将来<T>送信(Runnableを<T>タスク、T結果);
今後<T>送信(Runnableをタスク)
。4、のRunnableインターフェース、及び呼び出し可能インターフェース:P222、Runnableインタフェースとインタフェースの実装クラス呼び出し可能な、またはThreadPoolExecutorのScheduledThreadPoolExecutorを行ってもよいです。両者の差が結果を返さないのRunnableですが、呼び出し可能な結果を返すことができます。執行ファクトリクラスは呼び出し可能、Runnableインタフェースにパッケージを置くために使用することができます。
ststic呼び出し可能なパブリック<OBJECT>呼び出し可能(Runnableをタスク);
公共ststic <T>呼び出し可能<T>呼び出し可能(Runnableをタスク、結果T)。

 

おすすめ

転載: www.cnblogs.com/lym414/p/11234052.html