スレッド安全性の問題と解決策

ARTICLE:
マルチスレッド人々の開発には、スレッドの安全性の問題(可視性の問題と呼ばれる専門用語・メモリ)を表示しますマルチスレッドプロセスを開発することが可能であることを知っているが、必ずしもそうではない、すべての時間が表示されます。これが起こる、他の開発者がうずきを頭皮なり、起動できません、我々は徐々に、深さで、マルチスレッド発表します。

本論文では、Javaのマルチスレッド開発の利点を説明し、この技術を使用して、いくつかのメモリは、目に見えない問題と対応する解決策を表示されることがあります。次のようにこの記事では、知識のいくつかの作品を学びます:

なぜマルチスレッド技術(のマルチスレッド利点)
マルチスレッド技術の使用に起因する問題のいくつか
目に見えることなく、メモリの問題を生成する
原因のメモリの問題が表示されていない
、我々が目に見える問題やメモリの問題を生成する方法を分析した後、ソリューション
テキストに以下の

なぜ技術(マルチスレッド利点)マルチスレッド
の強力なコンピューティングは、マルチプロセッサ・システムを十分に発揮することができ、スレッドは欠かせないJava言語の重要な部分であり、彼らは、複雑なシンプルな非同期コードを作成し、複雑なシステムの開発を簡素化容量。

ハードウェアリソースをフルに活用してください。スレッドがCPUをスケジュールの基本単位であり、それはシングルスレッドである場合、それが唯一のプロセッサで実行することができるので、他のCPUリソースが浪費されることを意味します。さまざまなスレッド間の通信が正しく、マルチスレッドプロセッサリソースを最大限に活用することができるようになりますように、複数のスレッドがある限り、複数のプロセッサ上で同時に実行することができます。
エレガントな構造。モデリングプログラムを作成する単純な機能モジュール、複雑な手順の単一ブロックの各機能部、にコードの膨大な量、複雑なプログラム可能なマルチスレッドプログラムは、テストは、明確に、より洗練され、より便利な構造です。
非同期処理を簡素化します。ブロックしないようにするには、シングルスレッドのアプリケーションは、ノンブロッキングを使用しなければならないI / O、I / Oの複雑さは、同期I / O、およびエラーが発生しやすいよりもはるかに高くなるように。
マルチスレッド技術の使用は、問題のいくつか持参する
スレッドセーフ(メモリの可視性の問題を):複数のスレッドの下で統一プロセスが同じアドレス空間とデータを共有しているため、だけでなく、原因のスレッドの実行順序の予測不可能な性質のために、スレッドがよいです他のスレッドが使用されている、この態様はデータ共有の利便性をもたらすことである変数を変更する。一方で、適切に取り扱えば、ダーティー読み取り生成されます、ファントム読み取りおよびその他の問題が、幸いJavaは助けるために同期メカニズムのセットを提供こうした組み込みのロックとして、この問題を解決します。
アクティブ問題。発生し、さらにはデッドロックする可能性が長時間ロックを待っています。
パフォーマンスの問題。頻繁な切り替えをスケジューリングしたスレッドは、データ同期メカニズムが無効なメモリ・バッファ、および同期トラフィックの増加につながる、資源の無駄になります。
可視問題(スレッド安全性の問題が)されることなく、メモリ状態が発生
発生メモリ不可視条件は、両方の
1複数のスレッド
の変数が存在する共有2.
(複数のスレッドが共有変数を操作するとき、スレッド安全性の問題を生成することが可能ですメモリの問題)が表示されません。

問題に目に見えないメモリ原因
3つの理由から目に見えない問題のメモリを。
1.保証のアトミックコードはありません
2.保証は、コードの可視性がない
3.注文のコードという保証はありません
メモリを生産することは保証されませんアトミック1.1が表示されていないが、究極の理由は?
現代のマルチコアCPUのための並列で達成することができるので、私は、このような質問を読んでいたとき?
多核同時に同じメモリ内のデータを操作します。例えば、私は++コードは、マルチコアプロセッサは、同時にコードの行を実行するのだろうか?答えは、同時に実装されることはありません。
参照してください
究極の理由1.2不可視のコード生成されたメモリの可視性保証するものではありませんか?
可視性が定義されています。すぐに見ることができ、別のスレッドにスレッドを書くこと。
最新のプロセッサは、読み出しおよび一時書き込まれるデータを格納するバッファメモリ、バッファ、メインメモリから読み出された非同期リードバッファデータを書き込む書き込みました。ライト・バッファとの継続的な命令パイプラインを確保することができ、それが発生したメモリへの遅延書き込みデータを待って停止するプロセッサを避けることができます。非同期バッファの更新を書き込み、同じアドレスに複数の書き込みバッファ書き込みをマージしながら、メモリバスの占有率を低減します。

仮定するスレッドAは、Bは、それぞれ、二つのプロセッサに最初= 0は、最初のスレッドA = 1、次いでBが変数を読み取るため= 2、スレッド3を実行したスレッド実行、実行するために、最終的に少数になります?012への答えは可能です。
0理由は:最初のスレッド= 1を実行し、その後、バッファに書き込まれ、その後、B = 2を実行したスレッドは、書き込みバッファに、書き込みバッファは、二つのリフレッシュ時間はまだ3スレッドていないと想定されます変数に読み込み、変数aに糸3を読んで、この時間は0です。
理由1:次に、書き込みバッファに、= 1の最初の実装を通し、そして、スレッドBは、書き込みバッファに、= 2を実行すると仮定するスレッドホストプロセッサ書き込みバッファが更新されている、スレッドBとしないリフレッシュスレッド3は、変数を読み取るため、変数aに糸3を読み取るために、この時間は1です。
理由2:次に、書き込みバッファに、= 1の最初の実装を通し、次にB = 2を実行したスレッドは、プロセッサスレッドBは、書き込みバッファが更新されているものとする書き込みバッファに、スレッドリフレッシュ時間はまだ変数を読み取るために3スレッドしていない、変数aに糸3を読んで、この時間は2です。
書き込みバッファがあり、非同期バッファをリフレッシュ:魅力、コード生成されたメモリの可視性が表示されていない保証はない究極の理由を要約すると。
1.3保証メモリに生成されたコードを注文するための究極の理由が表示されていないが?ありませんか
プログラムのパフォーマンスを最適化するために、コンパイラやプロセッサがソートから実行されるので、順序がありますメモリの問題は表示されません。

解決した後、私たちはどのように見えるメモリの問題と課題の分析があります
メモリの可視性の問題がどのように我々のコードを解析するためには生成されません
、Java仮想マシンがメモリを分析するためのJavaメモリモデルを提供しますが、視認性に問題はありませんが、 Javaメモリー・モデルは、可視ラインメモリの問題を生成するプログラマをより良い分析を支援するためのルール(事前発生、等)のセットを提供します。

問題の解決後に
3つの理由スレッド安全性の問題を生じさせる、溶液は秩序可視3.コードのコードを確実に確保するためのコードの1 2原子以外の何物でもないことを確認。
JVMは、セキュリティスレッド解決するための同期や揮発性のキーワードを提供
同期は整然としたコードを確保するために、コードの視認性を確保するために、アトミックコードを保証することができます。
揮発性は、コードの順序を保証するために、コードの視認性を確保ますがアトミックコードを保証することはできません。
だから、同期スレッドの安全性の問題が完全に解決が、揮発性ではないことができます。

概要
なぜBenpianはそれを書きましたか?Javaの並行処理の本を読んだ後、私は非常に混乱しているので、何のゲインを感じていない、私はそれを読んだ後、要約する何かを書きたかったが、彼らは起動できません、Javaのメモリモデルと同期して、揮発性のキーワードを導入する方法がわかりません。なぜ、後のJavaメモリモデルと同期であることが判明し、それを起動しない、揮発性は場所ではない理解しました。

Javaのメモリモデルは、私たちは私たちのコードは、メモリの問題の可視性を存在しません理解するのに役立ちます。
同期、揮発性の可視性は、私たちは、メモリの問題を解決することができます。前者は問題が解決された後に生成される問題を引き起こさない分析です。
----------------
免責事項:この記事は元の記事CSDNブロガー「Sprint01」であり、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。 。
オリジナルリンクします。https://blog.csdn.net/SprintMan/article/details/79641180

おすすめ

転載: www.cnblogs.com/xianshiwang/p/11443914.html
おすすめ