読む「アートのJava並行プログラミング、」ノート

まず、マルチスレッドセマンティクス

  • でもシングルコアプロセッサは、タスクを実行する各スレッドのCPUにCPUタイムスライスを割り当てることによって、マルチスレッド・コードの実行をサポートし、現在のタスクの実行がタイムスライスした後、次のタスクに切り替えられ、CPUは常に切り替えスレッドによって実行されます。

  • ある程度の大きさのない同時実行がない場合は、シリアル実行よりも遅い速度になります。スレッドの作成とコンテキスト切り替えのオーバーヘッドがあるためです。

  • どのようにスレッドの作成とコンテキスト切り替えのオーバーヘッドを削減するには?(CSの "vmstatの1" パラメータは、スレッド切り替えをビュー)

    • ロックフリー並行プログラミング。アプローチのいくつかは、このようなハッシュアルゴリズムモジュロセグメントに応じてIDデータとして、そのようなCASアルゴリズムとして、ロックの使用を回避するために使用することができるマルチスレッドロック競合は、データのマルチスレッド処理をコンテキストスイッチを引き起こす可能性があり、異なるスレッドが異なるセグメントを処理しますデータ。
    • 最小スレッド付き。他の手段によって、このようなスレッドプールなどの不要なスレッドを作成しないようにしてください。
    • コルーチン。単一スレッドで達成し、シングルスレッドで複数のタスクの切り替えを維持するために、マルチタスクをスケジューリングします。
  • デッドロックを回避するには?

    • スレッドが同時に複数のロックを取得しないでください。
    • lock.tryLock(タイムアウト)を使用して、タイムロックを使用して、代わりに内部ロック機構を使用してみてください。
    • データベースのロックのために、ロックとロック解除は、そうでない状況が失敗した表示され、データベース接続でなければなりません。
  • ロックフリーの状態は、状態、ロック状態(また、ミューテックスとして知られている)、軽量かつヘビー級ロックをロックする状態、これらの傾向があります。Java SE 1.6では、ロックはローからハイに国家レベルの4種類があります状態で徐々に競争がアップグレードされます。ロックはアップグレードできますが、この戦略の目的をダウングレードすることはできません取得の効率を改善し、ロックを解放することです。サイクリングCASはロックを解除するときに使用されるシンクブロックを終了すると、ロックを取得するためにループCASの方法を使用している場合、スレッドが同期ブロックを入力したいときにバイアスされ、ロックに加えて、JVMは、ロックの方法は、サイクルCAS、つまり使用され得ることは興味深いです。

    スレッドがスピンによって常にあるとき、競争がスレッド間で存在する場合、「偏ったロック」「軽量ロック」を使用するためには撤回されます。一つだけのスレッドが同期ブロックに入ると、それは最初に「偏ったロック」を取得します「軽量ロック」(スレッドの実行時間がなど、長すぎるためにロックを獲得した理由)未満を取得し、その後、「軽量ロック」に展開されます「ヘビー級のロック。」

二、Javaのメモリモデル

  • JMM(Javaのメモリモデル)を確保するために可視性を提供するために、各スレッドのローカルメモリとメインメモリ(ローカルメモリ)との間(メインメモリ)の相互作用を制御することにより、共有メモリモデルを使用するJavaプログラマのためのメモリ。

  • 2、コンパイル自尊心の並べ替えの前に、それぞれ、一連の命令にJavaソースコードの最後の実際の実装、経験「コンパイラの最適化の並べ替え」、「ILPの並べ替え」、「並べ替えメモリシステム」から、これらの並べ替えは、マルチスレッドプログラムにつながる並べ替えるに属するプロセッサは、メモリの問題の可視性を表示されます。メモリの視認性を確保するために、Javaコンパイラは、メモリバリア命令の代わりに、命令のシーケンスを生成するプロセッサ並べ替えの特定のタイプを無効にするために挿入されます。4つのカテゴリにJMMのメモリバリア:

    • プログラムのために変更されます結果を並べ替え、JMMは、コンパイラを必要とし、プロセッサは、このような並べ替えを禁止しなければなりません。
    • 結果は必須ではありません並べ替え、JMMコンパイラやプロセッサのためのプログラムを変更しません。
    • そのため、プログラマはセマンティクス(結果)が実行するプログラムを変更することはありません、ビュー、本質的には事前発生関係とAS-IF-シリアルセマンティクスは一つのことです。
  • これは、前-起こるJMMの中核概念です。コンパイラと、複数のプロセッサまたは再照合に対応するルールを、前に発生し、JMMは、並べ替え規則の複雑さを隠し、およびルールによって具現これらのルールは、事前発生、プログラマはその発生し、前にルールをプログラムメモリの視認性を確保。

    • プログラムシーケンスはルール:各操作のスレッドは、たまたま-前に、後続の操作スレッドに。このルールは、そのよう-IF-シリアルセマンティクスを保証します。
    • ロックのルールを監視:ロックを解除するロックは、たまたま、前にロックのその後のロック。
    • 揮発性変数のルールは:任意のフォローアップでは、この揮発性域を読む前に起こる-volatileフィールドに書き込みます。
    • 推移:Aがどうなる、前B、及びBが発生し、前C、次いでAが発生し、前C.
  • シーケンシャル一貫性メモリモデルは、理論的な参照モデルであり、JMMメモリとプロセッサ一貫性モデルは、参照メモリ・モデルのために通常は設計されています。

  • シーケンシャル一貫性モデル、JMM、プロセッサのメモリモデル、メモリモデルの性能をより追求し、弱いメモリ・モデルは、そのボンデージメモリモデルを削減するために設計されるので、弱いに強いから設計。

三、同期、揮発性および最終的意味記憶

  • 同期で行われ、これらの単一の読み取り/書き込み操作で同じロックを使用しているとして、揮発性の性質を理解するための良い方法は、揮発性変数/書き込みの単一の読み取りです。要するに、揮発性変数自体は、次の特性があります。

    • 可視性。常に、揮発性変数の(任意のスレッド)最後の書き込みこの揮発性の変数を見ることができ読み取ります。
    • アトミック。任意の単一可変揮発性読み出し/原子が、揮発性のないような複合++原子の動作と同様書き込みます。
  • volatileキーワードの視認性を確保するには?揮発性メモリのセマンティクス?

    • 揮発性変数データへの書き込み時間は、現在のプロセッサのキャッシュラインを設定するとバックシステムメモリに書き込まれます。
    • 揮発性変数を読み取ることと、プロセッサは、現在のデータがシステムメモリから変数の値を無効リードとしてキャッシュ・ラインを設定して設定します。
  • その秩序を確保するためにどのように揮発性のキーワード?

    • 各先行書き込み動作(禁止通常の書き込み上記及び以下の揮発書き込み並べ替え)揮発性StoreStoreバリアを挿入します。
    • ライトバック操作は、揮発性StoreLoadバリアのそれぞれに挿入される(並べ替え/書き込み以下の揮発性リードを有することができる上記揮発性書込みを防止するため)。
    • 各読み出し動作の後に(禁止以下の上限および並べ替え揮発性リードの全ての通常の読み出し動作)揮発性LoadLoad障壁を挿入します。
    • (揮発性の並べ替え上記のすべての共通の書き込みと下の禁止読み取り)揮発性LoadStoreの各読み出し動作の後にバリアを挿入します。
  • JDKのドキュメントでは、CASは、揮発性および不揮発性の両方の読み書きメモリセマンティクスを持っていると言うのはなぜ?

    • コンパイラは、任意の揮発性揮発性の読み取りにメモリ操作の順序を変更し、リードバックしません。
    • コンパイラは、並べ替え操作の前に揮発性および揮発書き込み任意のメモリへの書き込みはありません。
    • CAS(比較およびスワップ)動作は、書き込みの前に可変の揮発性読み出し手段揮発性リードと共にとセマンティクスに書き込み、コンパイラはCAS CASの表裏でメモリ動作を並べ替える任意することができません。
  • 原理Synchonizedキーワード?JVMベースの同期およびブロック同期出入りモニターは、メソッドを実装するオブジェクトが、二つの実装の詳細と同じではありません。ブロック同期がmonitorenterとmonitorexit命令を使用して達成され、同期の方法が他の方法を使用して実装され、具体的に詳細とJVMの仕様には示されていません。

  • メモリのセマンティクスにリリースし、アクセスをロック?

    • スレッドがロックを解放すると、JMMは、メインメモリにフラッシュスレッドローカルメモリの共有変数に対応するであろう。(そして同じ揮発性メモリ書き込みセマンティクス)
    • スレッドがロックを取得するときに、スレッドがデアサートされるローカルメモリを対応JMMであろう、システムメモリは、このように変数値から読み出されます。(読み取り揮発性メモリと同じセマンティクスを)
  • 最終的な変数、及び(「オーバーフロー」コンストラクタない場合、オブジェクト参照)は、2つのルールに従うように並べ替えプロセッサコンパイラの:

    • 最終的な変数のコンストラクタに書き込まれ、その後、オブジェクトは、これら二つの動作の間に再配列しない、参照変数に割り当てられたこの構成を参照。
    • 最初のオブジェクト参照を読み出して最終変数が含まれており、最終的な初期変数を読み取り、並べ替えは、これら2つの操作の間はありません。
  • final変数意味記憶?

    • 書かれた最後の変数の並べ替え規則は、コンストラクタの復帰前にStoreStore障壁を挿入し、最後の変数の後にコンパイラを書くことが求められます。
    • 最終の可変並べ替え規則はLoadLoadコンパイラは、読み出し変数の最終的な動作の前にバリアを挿入する請求読み取ります。
  • コンストラクタの内部で、これはつまり、オブジェクト参照がコンストラクタで「流出」することはできません、他のスレッドに構築されたオブジェクトの参照として見ることをさせることはできません。JMMは保証できませんので、コンストラクタにし、「参照されたオブジェクトの構築」2間並べ替えられる「変数を書き込みます」。

第四に、他の

  • JPSとjstackコマンド?

    • JPS:ビューJVMプロセス情報
    • jstack:JVMスタックプロセスに関する情報を表示します
    • スレッド情報とJstack dumpコマンドは、プロセスのpid 18023のスレッドがやっているを探します。
    jstack 18023 > /home/wwwroot/dump18023
    • 統計スレッドがどのような状態になっています
    grep java.lang.Thread.State dump18023 | awk '{print $2$3$4$5}' | sort | uniq -c
  • あなたは、リソースの制約の問題を解決するためにODPS、Hadoopクラスタを使用するか、独自のサーバハードウェアを構築することができます。

  • オブジェクト参照は4バイトです。

おすすめ

転載: www.cnblogs.com/jmcui/p/11570366.html