その後シリーズは、主に将来の審査時間を容易にし、忘れないようにするために、ブックのメモや関連知識を読み込む「の分野でのJava並行処理」についてです。直接トピックに騒ぎ、:
第1章並行プログラミングの課題
並行プログラミングの目標は、プログラムの実行速度を速くするために、より多くのスレッドが同時実行を最大化するためのプログラムを作ることができます開始することではありません。ハードウェアとソフトウェアの制約によって制限され、コンテキスト切り替えの問題、デッドロック、およびリソース:並行プログラミングは、次のような多くの課題に直面します。
1.1コンテキストの切り替え
コンテキストスイッチは、タスクの状態が保存されます前に、次のタスクに切り替えるためには、あなたは、この状態にロードすることができます。1つのタスクからのコンテキストスイッチはリロードの過程を保存することです。
1、マルチスレッド一定速いですか?
必ずしもそうではありません。スレッドとコンテキストスイッチのオーバーヘッドの作成には時間がかかりますので。
2、どのようにコンテキストスイッチを減らすために
方法:いいえ並行プログラミングロック、CASアルゴリズム、スレッドとコルーチンの最小限の使用と。
1.2デッドロック
簡単なシナリオを見てください:
1つの パブリック クラスDeadLockDemo { 2 プライベート 静的文字列A = "A" 。 3 プライベート 静的文字列B =「B」。 4 パブリック 静的 ボイドメイン(文字列[]引数){ 5 新しいDeadLockDemo()デッドロック()。 6 } 7 プライベート ボイドデッドロック(){ 8スレッドT1 = 新しいスレッド(新しいRunnableを(){ 9 @Override 10 publicvoidラン(){ 11 同期(A){ 12 トライ{にThread.currentThread()睡眠(2000 )。 13 } キャッチ(InterruptedExceptionある電子){ 14 e.printStackTrace(); 15 } 16は、 同期(B){ 17のSystem.out.println( "1" )。 18 } 19 } 20 } 21 }); 22スレッドT2 = 新しいスレッド(新しいRunnableを(){ 23 @Override 24 publicvoidラン(){ 25 同期(B){ 26は、 同期(A){ 27のSystem.out.println( "2"); 28 } 29 } 30 } 31 }); 32 t1.start()。 33 t2.start()。 34 } 35 }
このコードは、互いがロックを解放するのを待っデッドロック、スレッドT1およびT2のスレッドが発生します。
回避デッドロックへの一般的な方法:
1)ロックを回避するために、複数のスレッドを取得するステップと
2)同時に、ロックで複数のリソースを占有し、各ロックが一つだけのリソースを取ることを保証しようとしたスレッドを避けてください。
3)lock.tryLock(タイムアウトを使用して)の代わりに内部ロックを使用して、タイムロックを使用してみてください
4)データベースのロックのために、ロックおよびロック解除は、それ以外の場合は、状況をロック解除に失敗し、データベース接続でなければなりません。
1.3リソースの制約の挑戦
リソース制限は:並行プログラミングの際に参照し、プログラムの実行速度は、コンピュータのハードウェア資源やソフトウェア資源によって制限されます。
資源制約の問題を解決します:
1)ハードウェアリソースの制約のために、プログラムの並列実行のクラスタを使用することを検討してください。スタンドアロンのリソースが限られているので、その後、複数のマシン上で実行するプログラムを聞かせて。
2)ソフトウェアリソースの制約のために、リソースプールのリソースの再利用を使用することを検討してください。