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計算結果の効率的で伸縮性の高いキャッシュを作成する
第一章
複数のスレッドが同時に共有データを操作
安全が「何も悪いことが起きていない」ことを意味するなら、活発さが注目されるのは「良いことが最終的に起こった」ことだ.
...,スレッドは、実行時にある程度のオーバーヘッドをもたらします.コンテキスト切り替え(Context switches),...,これは、複数のスレッドからなるアプリケーションで頻繁に行われ、大きなシステムオーバーヘッドをもたらします....、CPUの時間は、実行ではなくスレッドのスケジューリングに費やされます.
第二章
正確性は、クラスがその規約と一致していることを意味します.良好な規約は、オブジェクトの状態を強制するための不変制約(invariants)と、操作の影響を記述する事後条件(postcoditions)を定義する.
1つのクラスはスレッドが安全であり、複数のスレッドにアクセスされたときにクラスが正しい動作を継続できることを意味します.
操作AとBがあると仮定し、Aを実行するスレッドの観点から、他のスレッドがBを実行すると、耀目Bはすべて実行が完了するか、少しも実行されていない場合、AとBは互いに原子操作である
スレッドは、自分が優位なロックを取得しようとしたときに、リクエストが成功すれば、ロックを再読み込みできます.
複数のスレッドによってアクセス可能な可変状態変数ごとに、そのスレッドにアクセスするすべてのスレッドが実行時に同じロックを占有している場合、この変数はこのロックによって保護されていると言います.
複数の変数に関連する不変の制約ごとに、同じロックで他のすべての変数を保護する必要があります.
第三章
同期がない場合、コンパイラ、プロセッサは、実行時に操作をスケジュールする実行順序が予想外である可能性があります.適切な同期が行われていないマルチスレッドプログラムでは、「必然的」にメモリに発生する動作を推定してみると、エラーが発生します.
可視性は保証されており、メモリの値は定義されており(つまり判断できる)、抽象的に聞こえるかもしれません.例えば、複数のスレッドが1つの64ビットのlong long変数に対して値の修正を行うと、スレッドAは変数の上位32ビットアドレスを修正している可能性があり、スレッドBは変数の下位32ビットアドレスを修正しているので、最後の値はundefined、すなわち判断できない.
ThreadLocalでは、各スレッドを数値を持つオブジェクトに関連付けることができます.ThreadLocalはgetとsetアクセサを提供し、使用するスレッドごとに個別のコピーを維持します.したがってgetは、現在の実行スレッドによってsetによって設定された最新の値を常に返します.
本質は,コンテナをグローバルに設定し,currentThreadを判断してコンテナに格納することによって実現される.
第五章
List t = Collections.synchronizedList(new ArrayList()) ;
同期コンテナは、コンテナのすべてのステータスにシリアルアクセスすることで、スレッドのセキュリティを実現します.このような代価は合併性を弱めることだ.コンカレントコンテナはこれに基づいて設計され,部分的な同期性を犠牲にしてコンカレント性能を取り替える.