スレッドの安全性とは何ですか
複数のスレッドがスケジューリング環境を使用するか、どのようにこれらのスレッドが交互にかかわらず、ランタイムで実行され、任意の追加の同期や調整を必要としないクラスにアクセスすると、このクラスは、呼び出し元のコードで、正しい挙動を示すことができ、その後、このクラスのスレッドセーフ呼び出します。----「並行プログラミングの戦闘。」
スレッドセーフとは何ですか
マルチスレッドの同時アクセス、正しい結果を得ることができません。
結果:
不安スレッドの原因:
++ NUMないアトミック操作、マルチスレッド切り替えエクスプレス、CPUスケジューリングのように、複数のスレッドの同時実行の場合には、いくつかのステップに分割され、2つが同じタイミングNUM同じ値である読み取ることが可能であり、それは+1操作、スレッドの安全性を得られます。
アトミック操作
アトミック操作は何ですか
- 一動作または複数の動作すべての実行および実施プロセスは、任意の要因によって中断されない、または実行しないかのいずれか。人気話す:一緒に成功させる操作の成功、私たちは一緒に失敗しません。
非アトミック操作アトミックになる方法
- 操作がアトミックであるように、キーワードを同期させます
volatileキーワードのみ可視性を保証し、原子性を保証するものではありません。
シンクロナイズドの深い理解
- 内蔵のロック:各Javaオブジェクトを達成するために、同期ロックとして使用することができ、これらのロックは、内蔵のロックと呼ばれています。ときにスレッドを使用すると、同期ブロックまたはメソッドロックを解除を終了すると、自動的に、ロックを取得するsynchronizedブロックまたはメソッドに入ります。ロックを取得する唯一の方法は、このブロックまたは同期ロック保護法に組み込まれています。
- ミューテックス:内蔵のロックが一つだけのスレッドがロックを獲得することができますで最も意味しているミューテックス、あるスレッドスレッドBが内蔵されたロックのホールドを取得しようとしたときに、スレッドAは、スレッドBまで待つか、ブロックしなければなりませんスレッドBがロックを解放しない場合は、ロックを解除し、その後、スレッドは永遠に待機します。
- 従来の方法の変形例:ロックされたオブジェクト
- 変更された静的メソッド:クラス全体をロックします
- 修正されたコードブロック:同期ロックオブジェクト(ロック)即ち、リアブラケットは、コンテンツを同期
揮発性のキーワードとその利用シナリオ
- そして、変数のみを変更することができます
- 変数の可視性、揮発性のキーワードは唯一の可視性を保証していることを確認し、原子性を保証するものではありません。
- 並べ替え命令を禁止
- 、B 2つのスレッドが同時に揮発性のキーワードを読み取り、それが表示され、Bに修飾スレッドの値、変数の値を変更し、読み出し次に、オブジェクトを改変しました
使用シナリオ:
- スレッドスイッチなど
- 単一の実施形態、変更されたオブジェクトインスタンスは、並べ替えの指示を禁止します
シングルトンスレッドの安全性
空腹の男のスタイル - 自体スレッドセーフ
- クラスがロードされると、それはいずれかを実行するために使用した後、インスタンス化されています。総メモリのクラスの比較ではなく、任意の後に使用する場合は、リソースを無駄にしました。
結果:
レイジースタイル - シンプルな文言ではないスレッドセーフ
- 必要に応じて、次にインスタンス化するとき
結果:
怠惰な人間 - 作られたスレッドセーフ
結果:
スレッドの安全性の問題を回避する方法
スレッドの安全性の問題の原因
- マルチスレッド環境
- 同じ共有リソースを操作する複数のスレッド
- 共有リソースに行わ非アトミック操作
どのように回避します
- マルチスレッド環境は - シングルスレッドマルチスレッド(必要なコード・ロック・アクセス)を変更します
- 複数のスレッドが同じ共有リソースに動作 - ない共有リソース(ThreadLocalの、共有されていない、ステートレス、不変の動作)
- アトミック操作に非アトミック操作(ロック、JDKクラスアトミック操作、JUCを提供同時対応するツールを使用して構築された) - 共有リソース上の非アトミック操作でした
三点ブレーク中の任意の時点で原因
ソースアドレスします。https://github.com/woxbwo/is-concurrent
コンプリート!!!