Java同時プログラミング実践——読書ノート(一)

5277 ワード

Java同時プログラミング実践——読書ノート(一)


『Java Concurrency in Practice』第1部の読書まとめ
キーワード:同時、ロック、スレッドセキュリティ、共有オブジェクト、同時コンテナ、信号量

目次


第一章紹介
1.1同時実行の短い履歴
1.2スレッドの利点
1.3スレッドのリスク
1.4スレッドがどこにもない
第二章スレッドセキュリティ
2.1スレッドセキュリティとは
2.2原子性
2.3ロック
2.4ロックで状態を保護する
2.5アクティビティとパフォーマンス
第三章共有対象
3.1可視性
3.2リリースとリリース
3.3スレッド閉鎖
3.4不変性
3.5安全なリリース
第四章組合せ対象
4.1スレッドセキュリティのクラスの設計
4.2インスタンスの制限
4.3委託スレッドセキュリティ
4.4既存のスレッドセキュリティクラスへの機能追加
4.5同期ポリシーの文書化
第五章構築ブロック
5.1同期容器
5.2同時容器
5.3ブロックキュー
5.4ブロックと中断可能な方法
​ 5.5 Synchronizer
5.6計算結果の効率的で伸縮性の高いキャッシュを作成する

第一章

  • スレッドのリスク
  • 競合シーン(race condition)
    複数のスレッドが同時に共有データを操作
  • アクティブ化に失敗しました(プログラムが実行または終了できません)
    安全が「何も悪いことが起きていない」ことを意味するなら、活発さが注目されるのは「良いことが最終的に起こった」ことだ.
  • 性能危険(performance)
    ...,スレッドは、実行時にある程度のオーバーヘッドをもたらします.コンテキスト切り替え(Context switches),...,これは、複数のスレッドからなるアプリケーションで頻繁に行われ、大きなシステムオーバーヘッドをもたらします....、CPUの時間は、実行ではなくスレッドのスケジューリングに費やされます.


  • 第二章

  • スレッドのセキュリティ
    正確性は、クラスがその規約と一致していることを意味します.良好な規約は、オブジェクトの状態を強制するための不変制約(invariants)と、操作の影響を記述する事後条件(postcoditions)を定義する.
    1つのクラスはスレッドが安全であり、複数のスレッドにアクセスされたときにクラスが正しい動作を継続できることを意味します.
  • 原子性
    操作AとBがあると仮定し、Aを実行するスレッドの観点から、他のスレッドがBを実行すると、耀目Bはすべて実行が完了するか、少しも実行されていない場合、AとBは互いに原子操作である
  • Java.uitl.concurrent.atomicパッケージには、数値とオブジェクト参照の原子変換(オブジェクトの動作はすべて原子)を実現する原子変数クラス(atomic variable)が含まれています.
  • AtomicLong(基本タイプ対応の原子オブジェクト)
  • AtomicReference(一部のオブジェクトは対応する原子オブジェクトを参照)
  • 複合アクション--「読み取り-変更-書き込み」と「チェック再実行」
  • これは2つの一般的な原子のように見えますが、原子の操作ではありません.対応付与文を読み書きし、対応条件判定
  • を再実行することを確認する.

  • ロック
  • 内部ロック
  • synchronized(ロックオブジェクトの参照、ロックコードブロック)
  • メソッドレベルのsynchronizedで、ロックオブジェクトはメソッドの呼び出し者です.静的メソッドのsynchronized,ロックオブジェクトは対応する呼び出し者オブジェクトのclassオブジェクト
  • である.
  • 内部ロックは反発ロックであり、少なくとも1つのスレッドだけがロックを持つことができるが、内部ロックは再入可能である.

  • 再アクセス(Reentrancy)
    スレッドは、自分が優位なロックを取得しようとしたときに、リクエストが成功すれば、ロックを再読み込みできます.

  • ロック状態の保護
    複数のスレッドによってアクセス可能な可変状態変数ごとに、そのスレッドにアクセスするすべてのスレッドが実行時に同じロックを占有している場合、この変数はこのロックによって保護されていると言います.
  • 内部ロックは、1つのスレッドがオブジェクトのロックを取得すると、他のスレッドがこのロックを取得することをブロックすることが1つしか確保できない.
  • VectorとHashtable
  • は、オブジェクトの内部ロック(synchronizedキーワード)を使用することによって、すべての可変状態
  • をカプセル化する.

    複数の変数に関連する不変の制約ごとに、同じロックで他のすべての変数を保護する必要があります.

    第三章

  • 可視性(defined)
    同期がない場合、コンパイラ、プロセッサは、実行時に操作をスケジュールする実行順序が予想外である可能性があります.適切な同期が行われていないマルチスレッドプログラムでは、「必然的」にメモリに発生する動作を推定してみると、エラーが発生します.
    可視性は保証されており、メモリの値は定義されており(つまり判断できる)、抽象的に聞こえるかもしれません.例えば、複数のスレッドが1つの64ビットのlong long変数に対して値の修正を行うと、スレッドAは変数の上位32ビットアドレスを修正している可能性があり、スレッドBは変数の下位32ビットアドレスを修正しているので、最後の値はundefined、すなわち判断できない.
  • の可視性は同時性の要求より弱く、データが
  • 期限切れになる可能性があることを意味する.
  • Volatile
  • 軽量級の同期機構
  • は、対応する変数参照のメモリが「表示」であることのみを保証し、データ同期は保証しません.
  • は、プライマリ・メモリから読み取り、メモリに書き込みます.(cpuレジスタには存在せず、性能損失)

  • ロックは、同期と反発だけでなく、メモリについても表示されます.すべてのスレッドが共有する可変変数の最新値を見ることができることを保証するために、読み出しおよび書き込みスレッドは共通のロックを使用して同期
  • しなければならない.
  • オブジェクトのパブリケーションと逸脱(publishing&escape)
  • パブリケーション:現在の範囲外のコードで使用できるようにする
  • は、オブジェクトの参照を共通静的ドメインの
  • に格納する.
  • 非プライベートメソッドから参照
  • を返す.
  • はオブジェクトをパブリッシュし、そのオブジェクトのすべての非プライベートドメインが参照するオブジェクト
  • もパブリッシュします.
  • 逸出:計画されていないリリース
  • スレッドクローズ
  • ローカル変数
  • ThreadLocalクラス
    ThreadLocalでは、各スレッドを数値を持つオブジェクトに関連付けることができます.ThreadLocalはgetとsetアクセサを提供し、使用するスレッドごとに個別のコピーを維持します.したがってgetは、現在の実行スレッドによってsetによって設定された最新の値を常に返します.
    本質は,コンテナをグローバルに設定し,currentThreadを判断してコンテナに格納することによって実現される.
  • 単一スレッドは、Volatile変数を書き込みます.

  • 不変性(可変オブジェクト)
  • 可変オブジェクト:アクセサメソッドのみ、可変状態がカプセル化
  • .
  • 可変オブジェクトは常にスレッドセキュリティ(可変オブジェクトのfinal参照、可変と呼ばない)
  • である.

    第五章

  • シンクロコンテナ
  • VectorおよびHashtable
  • Collections.synchronizedXxxx(Xxxxxx)メソッドで作成された同シリーズ(
    List t = Collections.synchronizedList(new ArrayList()) ;
    
  • など)
  • 同期コンテナを使用するtoStringメソッドを簡単に使用/非表示にしないでください.synchronizedキーワードで修飾され、シリアル化されているため、非常に時間がかかる可能性があります.

  • 同時容器
    同期コンテナは、コンテナのすべてのステータスにシリアルアクセスすることで、スレッドのセキュリティを実現します.このような代価は合併性を弱めることだ.コンカレントコンテナはこれに基づいて設計され,部分的な同期性を犠牲にしてコンカレント性能を取り替える.
  • Queue
  • BlockingQueue
  • LinkedBlockingQueue
  • ArrayBlockingQueue
  • PriorityBlockingQueue
  • SynchronousQueue

  • ConcurrentLinkedQueue
  • Deque
  • ArrayDeque
  • LinkedBlockingDeque


  • Map
  • ConcurrentHashMap—— Hashtable/synchronizedMap
  • ConcurrentSkipListMap ——synchronizedSortedMap

  • Set
  • ConcurrentSkipListSet —— synchronizedSortedSet

  • List
  • CopyOnWriteArrayList —— synchronizedList
  • 読み書き同期


  • ブロックキュー(Blocking Queue)&生産者-消費者モード
  • ブロックキュー天然サポート生産者-消費者モデル
  • Dequeと盗難モード
  • Synchronizer(シンクロナイザ)
  • latch(閉鎖)
  • 同期開始と終了
  • semaphore(信号量)
  • は、ブロックキュー
  • を実現する.
  • barrier(レベル)
  • cycle