Javaのマルチスレッド - 知識のロジックマルチスレッドの並べ替え

1マルチスレッドの基本的な目的の知識を学びます

       基本的な目的のマルチスレッド知識がある:並行プログラムの堅牢設計。
       もちろん、我々は(具体的な戦略に関連する特定の事業に関連している、)この非常に実用的な問題に答えることはできませんが、この記事では、知識との関係に焦点を当て、初心者はAPIインタフェース、マルチスレッドツールクラスの中で迷子にしたくありませんインチ

三つのマクロの問題2つの並行プログラム

       スレッドの安全性の問題、パフォーマンスの問題、アクティブな問題。3の関係は、最初のセキュリティスレッドを確保するための並行プログラムの設計プロセスでは、スレッドセーフなプログラムのパフォーマンスを改善するための努力のもとには、スレッドの安全性の問題を確実にし、パフォーマンスを向上させるために活動の導入を避けることです。
       (と(ようなロックや同期メソッドとして)セキュリティを確保し、同時パフォーマンスの最適化、スレッドの安全性は最も重要な、並行プログラムは、パフォーマンスを向上させるために設計されていますが、決して忘れないその性能はセキュリティに基づいて構築されていますロック、ロックセグメント等)プロセスによって分解が、活性は、デッドロック、飢餓、ライブロック、このような)乏しい応答性などの問題などの問題を(導入することができます。この記事では、知識のスレッド安全性の問題に焦点を当てています。

3スレッドの安全性

スレッドの安全性の定義3.1

       複数のスレッドが一貫して表示することができますクラスにアクセスすると、正しい行動をし、このクラスはスレッドセーフであると呼びます。コアコンセプトは正しいです。正確含意はまさに、クラスの行為とその仕様です。
       あなたが料理を設計する必要があり、食材やスパイスがこの料理を作るに制御しなければならないように、つまり、あなたは、キャノーラとして、これらの食材やスパイスの操作の結果の説明を強要することができ、塩料理は塩辛いだろう、お香を入れますインスタント食品、その後、塩、この料理を作るすべての要素が唯一の料理は仮定と一致している明確かつ明快なデザインを持っているときを知っています。設計プロセスが同じである場合には、様々な変数や関数の使用のみが制御可能であり、設計に応じて実行するようにプログラムを設計。マルチスレッドを使用することは、プログラムの特定の可変組成及び挙動となることがあり手に負えない

3.2なぜマルチスレッドは、スレッドの安全性の問題をもたらします

       2自然を説明するための人生の例(原子の問題と可視性の問題)スレッド安全性の問題で、ここで、ここで紹介していない、まだ、JAVAのメモリモデルに深く必要スレッド安全性の問題を明確にします。
[ 実施例1 ]例えば調理します。塩される操作は、塩が動作する3つのステップに分解することができる「→塩は塩→塩を皿に注がれる缶詰食品インスタントある見つけることができる塩類を確認してください。」一人だけ、塩シェーカーの使用であれば、何の問題もないでしょう。塩を皿に注いだ後しかし、あなたの前にあなたは「塩をロードされる塩タンクをチェックする」場合は、別の男がバックメラミン粉ミルクを入れ、塩シェーカーを取り、塩シェーカー。あなたは最終的にはメラミン牛乳に取って代わるだろう、知らないこの交換プロセスは、予測可能な結果で、皿の上に注ぎました。これは、スレッドの安全性の問題のあるアトミック性の問題
アトミックメモリモデルから問題を理解するjuejin.im/post/5d7760 ...

[ 実施例2 ] A及びBは、例として米を調理するように協働します。3つの部屋(キッチン、火災制御室、観察室)がありますを見たときに、ご飯(ポットがあると言う紙に「調理されています」または「未熟」)、熱オフ責任制御室の火災(キッチンポットがありますポットのステッカー上のステータスワード(すでに調理/未熟)を紙と言い、鍋「で調理された」)、Bが観測室でメーターの状態を観察するための責任があるに熱をオフにして、変更、およびBは、部屋の中で直接通信することができないではありません;書くために一枚の紙の上にご飯が「熟している」場合Bは、鍋の下に「未熟」書くための未熟を、すべて1メートルを観測する、Bがビジー状態である、彼の言葉の紙をドアに取り付けた終了します上、ポットキッチンに貼付されていません。最終結果は、状態を見るために鍋の言葉は「未熟」となっているされているので、熱をオフにし、そして最終的に米のペーストはありません。これは、問題の可視性
メモリモデルからの視認性の問題を理解するjuejin.im/post/5d7760 ...

カーネルメモリのアトミック性と可視性の問題を解決するために3.3

       スレッドセーフなコードを書くために、そのコアが上となる状態(変数)アクセス動作が実行管理を特にため、共有及び可変アクセス状態。
       複数のスレッドによって共有されることはアクセス操作、修飾され得る可変手段。
       塩は、他の人を使用することができない共有されていない場合、上述した実施例1において、すなわち、どのスレッドの安全性の問題は存在しないであろう。規定は、塩タンクに行くことができない場合は、タンクは塩のみから削除することができ、その後、個人は、塩シェーカー塩入れ塩を操作することができますどのくらいに関係なくは、常にどのスレッドの安全性の問題ではありません。同様に、変数を変更できない場合、どんなに多くのスレッドはこの変数をどのように動作するか、それはスレッド安全性の問題を持っていません。
       上記実施例2では、ステータス・ワードを変更した後の力Bと、それがタイムリー火災をオフにする、米実ステータスを見ることができるように、ポットに取り付けられた紙は、香り米を蒸発させました。

       だから、アトミックとメモリの問題の可視性の問題を解決するために、どのように変数と変数の管理を共有するには?

  • あなたがドメインを必要としない限り(すなわち不変として宣言された)、それ以外の場合は、最終的なドメインとして宣言する必要があります、変数であります
  • 共有変数へのパラレル操作がシリアル動作に変換される(例えば、同期機構、容器を管理するために委託同期変数)
  • 共有変数に変換された変数は共有されていない(例えば、スレッドブロックとしての(閉じたスタック、ThreadLocalの等))
  • オペレーションがアトミックに実行する必要がある場合、この操作は、アトミック(例えば、オペレーティング・ロックへとして)実行されることを保証する方法を望ん
  • 変数のメモリの視認性を確保する必要性が、スレッドではなく、メインメモリのキャッシュから変数を読み取るように強制することができ、可変力でメインメモリにアクセスするスレッドを格納しています。(このようなロックのような、揮発性変数を宣言)

コアが共有管理状態変数である、覚えてロック(内蔵ロック、ロック・ロック)、同期コンテナ(ベクター、ハッシュテーブル、等)、及び容器(ConcurrentHashMapの、CopyOnWriteArrayListと)、同期ツール送信(セマフォブロッキングを、フェンス) 、ちょうどそうスレッドプールは、共有可変状態の管理ツールです。

おすすめ

転載: juejin.im/post/5d774c885188257e8c4d978e