JAva同時プログラミング実戦(メモ)

2921 ワード

第1章概要


少し、ノートを書く必要はないと思って、たくさん紹介して、実際の役割はありません.

第2章スレッドセキュリティ


2.1スレッドセキュリティとは?


デフォルトでは、n個のスレッドを作成します.スレッドの実行順序はプログラマーによって決定されるのではなく、cpuのスケジューラによって決定されます.その後、これは私たちが望んでいる効果ではありません.スレッドを制御し、マルチスレッドを操作して、複数のタスクを完了するのに役立つことを望んでいます.スレッドセキュリティとは何ですか?マルチスレッドは1つの変数を共同で使用すると、変数を争う場合があります.最後の結果は、計算が終わった後、計算の結果が間違っていることです.そこで、スレッドを秩序化する必要があります.変数を争う場合はありません.秩序化の手段は変数に鍵をかけることです.そうすれば、スレッドが安全であることを保証することができます.

2.2原子性


原子は分割できないので、スレッドの中で原子性について話して、複数のスレッドが同じ変数にアクセスしているはずだと思います.同じ時刻に、1つのスレッドしか変数を読み書きできません.このスレッドが読み書きが完了していない限り、他のスレッドは変数を読み書きできません.

2.2.1状態条件


Condition、スレッド競合の条件は、異なるCondition、notFull、notNullなどのオブジェクトを作成することで、ロックを正確に制御する目的を達成し、一般的には再ロックと組み合わせて使用されます.

2.3ロック機構


2.3.1内蔵ロック


synchronized、修飾コードブロック、または修飾メソッドボディ

2.3.2再ロック


ReentrantLock
 class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() { 
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

2.4ロックで状態を保護する


ロックを使用すると、共通の変数を独占状態にすることができ、マルチスレッド環境では、各スレッドが誤ったデータを取得しないことを保証できます.

2.5アクティブ性とパフォーマンス


実行時間が長い計算や、迅速に完了できない操作にロックをかけないでください.できるだけsynchronizedの範囲を縮小し、範囲が広いと、著者らは不良合併に属し、不良合併は安全のために大量の性能を放棄したと述べた.

第3章オブジェクトの共有


3.1可視性


例を挙げて、可視性を説明します.スレッド1、2、3があり、int n=0がある.マルチスレッド環境では,スレッド1が読み書き権を獲得したと仮定してnを1に修正し,プログラムが可視性を有する場合,2,3はnが見られる最新値,すなわち1である.これが変数の可視性で、本の中で表現したいのはこの意味だと思います.

3.1.1失効したデータ


著者らはdemoを書き,マルチスレッドの場合,スレッドが誤ったデータを読み出すことを実証した.避ける方法は同期メカニズムを使うことです..の

3.1.2非原子の64ビット操作


JAvaメモリモデルでは、変数の読み書き操作は原子操作でなければならないと規定されているが、非volatileのlongおよびdouble変数では、jvmでは64ビットの読み書き操作を2つの32ビットの操作に分解することができる.したがって、マルチスレッドの一環で上記の操作を実行すると、2つの32ビット操作のいずれかをランダムに取得する可能性があるため、マルチスレッドの環境では共通変数をvolatileで修飾することで安全である.

3.1.3ロックと可視性


本の中で1枚の図を描いて、図の中でスレッドAとスレッドBがあって、スレッドAは先に実行して、Bは後で実行して、スレッドAは変数に対する修正をして、スレッドBは実行する時前にスレッドAが修正する値を得ることができて、可視性です.

3.1.4 volatile変数


volatileは可視性のみを有し,volatileは軽量レベルのロックメカニズムであり,適用シーンは一般的にパブリッシュ状態であると論じた.volatileとsynchronizedの取捨選択は、volatileができることであり、synchronizedでも同様にできるが、いくつかの少数の状況ではvolatileを使用するのがより優れているだけだ.

3.2リリースとリリース


パブリケーション:オブジェクトをpublicとstaticで修飾すると、パブリケーションの逸出になります.簡単に言えば、いくつかのプライベート属性であり、もともとClassにカプセル化されており、パブリケーションすべきではありませんが、いくつかの他の理由で共有状態になり、プライベート性はありません.本では,逸脱防止策として工場法を用いてオブジェクトを作成する方法を紹介している.

3.3スレッド閉鎖