Javaの並行プログラミングビューティー - 基本

まず、スレッドは何ですか

スレッドは、物理的プロセスであり、スレッドは、独立して、存在しません。少なくとも一つのスレッドを含むプロセス。スレッドは、カップ割当の基本単位です。

 

 

 複数のスレッドのプロセスで共有ヒープと方法エリアは、各スレッドは、独自の独立したプログラムカウンタ及びスタックを有しています。

第二に、スレッドを作成して実行

相続スレッド、実行可能インターフェースを実装し、使用FutureTask方法:3つのスレッドを作成する方法があります。

違い:

1.継承されたスレッドの方法は、直接取得するにThread.currentThread()メソッドを呼び出し、現在のスレッドのメリットを得ることです。不利な点は次のとおりです。Javaは唯一の単一継承、継承されていない他のクラスの後に継承スレッド、貧弱なスケーラビリティをサポートしています。第二:複数のスレッドが同じタスクを実行するときにタスクをスレッド化し、コードの分離がない、コードが複数のタスクが必要です。

2.runnableインタフェースモードよりオブジェクト指向の考え方に沿ったスレッドのタスクとコード位相分離、。

3.FutureTask方法は値を返す実行スレッドを作成します。

第三に、スレッドの待機

1.wait() 

スレッドの呼び出しは()メソッドを待つ別のスレッドが通知()、のnotifyAll()メソッドまたは割り込み()メソッドを呼び出すまで、スレッドがブロックされ、スレッドがInterruptException例外とリターンをスローします。

また、待機()の呼び出しスレッドがオブジェクトのモニターロックを取得する必要があり、または例外がスローされます。

注:見せかけの起動呼び出されたときに常に目を覚ましするスレッドをテストするために必要な条件を満たしているので、スレッドがえっ行うことができますヨ呼び出すnotify()あるいはnotifyAll()は、ウェイクアップし、継続的な待ち時間(に満足していません)

同期(OBJ){

  {(ウェイクアップ条件が満たされていない)しながら

    obj.wait();

  }

}

2.wait(長いタイムアウト)

スレッドがタイムアウト時間内に覚醒していない場合はより多くのタイムアウトパラメータよりも、スレッドは、タイムアウトが原因で返されます。

3.wait(長いタイムアウト、int型またはnanos)

内部コール待ち(長いタイムアウト)

4.notify()

5.notifyAll()再開されたスレッドは、()待機を呼び出すことによりブロックされています。

前記実行終了の処理()メソッドへの参加します

このメソッドは、別のスレッドが実行されるまでブロックされています。

7.sleep()

スレッドは一時的に指定した時間に実行する権利を放棄しますが、スレッドはモニタリソースを開催したりあきらめません

8.yield()

スレッドがyeildメソッドを呼び出すと、現在のスレッドが最高の優先順位のスレッドでカップや利きスレッドレディキューを使用する権利を行います。

9.スレッド割り込み。

無効割り込み():割り込みスレッド、スレッドので、もしコール待機()、スリープ()、join()メソッドは、ブロッキング呼び出しがInterruptException例外がスローされますです。

ブールisInterruptedを():現在のスレッドが中断されたかどうかを検出します。

ブール中断された():現在のスレッドが中断されたかどうかを検出します。それは方法現在のスレッドが中断されたことが判明した場合、それを除いてisInterruptedを()は、それが割り込みフラグをクリアします。そして、スレッドの割り込みは()を呼び出すスレッドが現在のスレッドの割り込みフラグで、異なっています。

第四に、スレッドコンテキストの切り替え

カップは、ラウンドロビンリソース割り当てベースのポリシーです。スレッドの消費カップはタイムスライス内のタスクを実行し、各スレッドにタイムスライスを割り当てられています。これは、ラウンドロビンスレッドの切り替えが必要です。

タイミングを切り替えるスレッドは以下のとおりです。準備完了状態で終了したときに、現在のスレッドのタイムスライスカップを使用し、現在のスレッドが他のスレッドによって中断されます。

第五に、スレッドのデッドロック

1.スレッドのデッドロックとは何ですか?

デッドロックが他のスレッドによって保持された複数のモニタリソースを参照するには、お互いを待って、お互いを引き起こすために必要とダウンを実行し続けることができません。

四つのデッドロック状態が発生します。(1)相互に排他的な条件、スレッドによってのみ占有時間にリソースを。(2)要求および保持:スレッドがすでにリソースを保持し、かつ不可分の条件の新しいリソース(3)依頼:別のスレッドによって使用されていないリソースが独自に使用する前に終了して取得するためのスレッドを。

(4)ループ待機状態:デッドロックは、スレッドが発生した場合、それは、手段 - エンドレスチェーンのリソースとの間に形成されています。

2.どのようにスレッドのデッドロックを回避するには?

四つの条件は、開始点の一つ以上を破壊する必要があります。保留に要求し、待ちループのみを破壊することができます。

解決策:複数のスレッドを保持するために、リソース・注文要求。

6:ガーディアンスレッドとユーザスレッド

デーモンスレッドとユーザースレッド:Javaスレッドは、2つのカテゴリに分類します。JVMスレッド終了ユーザー出口。ユーザスレッドがあそこにされていないが、JVMプロセスが終了しません。

七、ThreadLocalの

複数のスレッドが同じ共有変数にアクセスする際に並行性の問題に特に起こりやすい、スレッドの安全性を確保するために、エンドユーザーは、共有変数にアクセスする際に適切に同期する必要があります。

ThreadLocalのは、各スレッドのコピーを作成します。各スレッドは、独自のコピーにアクセスします。

原則:

ThreadクラスはthreadLocalsとinheritableThreadLocalsを持って、彼らは、変数のThreadLocalMap種類があります。各スレッドがthreadLocalsにキーと値を追加しますセットを()を呼び出し、

ThreadLocalの継承をサポートしていません。

InheritableThreadLocalサポート継承。

八、並行性と並列性。

並行処理は、複数のタスクの実装では同時に同じ期間を指し、まだ終わっていません。これは、実行単位時間に並列に同時に複数のタスクを指します。並行オブジェクト指向がねじ込まれ、平行配向プロセスです。

ナインのメモリ可視性、javaの共有変数

マルチコア・カップは、独自のコントローラ、オペレータ及びキャッシュを有することになります。マルチレベル共有キャッシュがあります。

処理が完了した後、自身のキャッシュに共有キャッシュからコピーされたスレッドの作業は、共有キャッシュに書き込まれます。

テン、sychronizedキーワード

Javaのsychronizedは内蔵のロックアトミック提供することであり、Javaの各オブジェクトは、モニターロックとして知られ、ユーザーはJavaは、組み込みと呼ばれる内蔵のロックラッチを見ることができない、同期ロックとして使用することができます。

内蔵のロックを解除するのを待ちます。内蔵のロックは排他ロック、スレッドがロックを建て取得すると、他のスレッドはブロックされますです。

1.sychronized意味記憶

ブロックにSychronized、変数は、ワーキングメモリからブロック内で取得するが、共有メモリから取り出さないであろう、スレッドは、共有メモリにフラッシュ共有メモリにsychronized変更を終了します。

セブンイレブン、volidate

変数が他のスレッドにすぐに表示更新されることを保証するために(1)volidateキーワード。

(2)禁止命令並べ換え

Javaのメモリモデルが動作してパフォーマンスを向上させるために再発注指示やカップにコンパイラを許可する、それが存在していないとだけ指示データの依存関係を並べ替え。これは、マルチスレッドで問題が発生します。

volidateコマンドの並べ替えを無効にすることができます。

 

おすすめ

転載: www.cnblogs.com/feifei123/p/12551545.html