揮発性変数はスレッドセーフにそれを保証することができますか?なぜ?

  1. そう揮発性とは何ですか?

セキュリティスレッドに目を向けると、多くの場合、変数--volatileになります。「戦闘中のJava並行、」本はそれほど揮発性で定義されている - 「Java言語が弱い同期機構を提供する、すなわち、揮発性変数は、他のスレッドの更新通知は、変数ことを確実にするために使用されます。」この文が示す二つのこと:;視認性を確保するために②volatile①volatile変数は、同期メカニズムです。これら二つの点と我々は密接に関連して、「揮発性変数は、スレッドの安全性を保証できるかどうか」探ります。

  1. 揮発性の変数はスレッドセーフセックスをすることができますか?なぜ?

同期メカニズムは何ですか?並行プログラミングでは、パブリック変数への各プロセスへのアクセスは、この制約は、同期と呼ばれ、制約されなければなりません。これは、共有リソースへの制約である同期メカニズムです。質問があるので:揮発この「弱い同期メカニズム」の各プロセスは、共有リソースへのアクセスを制限する方法ですか?回答の嘘で「揮発性、視認性を確保するために」。

2.1可視性

揮発性の変数は、他のスレッドへの更新通知変数ことを確実にするために使用:フィールドの可視性を確保するために揮発性。揮発性の変数がvolatile変数を読み込む際に常に最も最近書かれた値を返すので、レジスタや目に見えない他の場所にキャッシュされません。

視認性との関係「変数(値、代入、等)を操作する方法のスレッド」:

私たちは、第一法則をクリアしなければなりません:メモリ進行中の(独立して所有する各スレッドに)取り組んでなければなりません(など値、代入、)変数のすべての操作をスレッドが、直接メモリに読み取りと書き込みの変数ができない、またワーキングメモリの中で相互訪問。揮発性の変数については、その特殊なシーケンシャルが所定の操作をするので、メインメモリの一般的な動作のように見えますが、実際には揮発性の変数は、この法律に従っています。

メインメモリとの間で、特定の作業メモリ対話プロトコル(すなわち、どのように作業メモリにメインメモリから変数をコピーするには、メインメモリなどに作業メモリから同期を達成する方法の詳細)に、Javaメモリー・モデルは、完全に動作の以下の8種類の定義します:

ロック:(ロック)、アンロック(ロック解除)、負荷(荷重)、使用(試験)、割り当て(アサイン)、格納(記憶)、ライト(書き込み))、読み出し(リード。

これらの動作8種類の揮発性は、二つの特別な揮発性の変数は、可視性を持っており、命令の並べ替えを禁止することができます許可する前からこそ、これらの限界のために制限しました:

①アクションを使用し、負荷アクションの前に読まれなければならない、3つのアクションが連続している必要があります。[サイード:すべてのワーキングメモリは揮発性の変数を使用する前に、最新の変数揮発性のメインメモリをピックアップする必要があり]

②割り当てアクションは、3つのアクションが連続している必要があり、店舗や書き込みアクションの後に従わなければなりません。[サイード:すべてのワーキングメモリは揮発性変数の値を変更し、値をメインメモリに書き戻さなければなりません]

ほかの二つの規則よりも、各スレッドがvolatile変数を取得することができたときに、その変数が最新の状態にしなければならないことを確実にするために、実際には、それは、スレッドの良い数と同等ですポイントなしの同じメモリ、ワーキングメモリとメインメモリを使用します。揮発性の変数を使用していない操作は、最新の変数の値を取得するたびに保証することはできません。

2.2我々は、スレッドの安全性を保証できるかどうかそう揮発性?

することはできません。

2.1の採用後、我々はマルチスレッド環境で非常に明確にされている、あるスレッドがvolatile変数を変更し、他のスレッドは、直ちに変数の最新の値を読み取ることができます。しかし、揮発性は、各スレッドが同じ変数へのシリアルアクセスであることを保証は、マルチコアマシンの場合には、二つ以上のスレッドが同時に同じ共有変数、スレッド安全性の問題に対する変更がまだ発生しません。例えば、マルチコアマシンの場合には、iは== 0、2つのスレッドが同時に私を動作++、最終的な結果は、おそらく誤った結果「I == 1」です。

だから、:操作はアクセス共有リソースにシリアル形式であることを確認する必要があり、スレッドの安全性を確保し、揮発性の缶はこれを実行しないようにするので揮発性は、ない保証スレッド安全性はありません。

2.3「は、まだスレッド安全性の問題があるでしょうでも修正する揮発性の変数を持つ。」のコードによって検証しました揮発性変数はスレッドセーフにそれを保証することができますか? なぜ?

揮発性変数はスレッドセーフにそれを保証することができますか? なぜ?

試験結果:(1)重複数が多いされている;(2)最後に、出力「-1」; ==「修飾まだ揮発性使用とスレッドの安全性に問題があった場合の説明変数。

コード分析:
スレッド競合状態が「最初のチェック後に実行する」が存在する:(1)ため、問題が発生します。そこ「(チケット> 0)場合は、」CPU(デュアルコアマシン)の実行を持って、彼らが何を決定する2つのスレッドもあり 、 および操作を「ticket--」しながら。
(2)ために問題が発生します。
①場合チケット== 1、二つ以上のスレッドを同時に判定ボックスコードを実行する「であれば(チケット> 0)」決意を進めることにより、
②それらが行います睡眠;「のThread.sleep(100)」;に
スレッドは、右カップの最初の実装をつかむし、「ticket--」操作、最新のチケットを実行し、目覚めた後、各③の値をプッシュするように言われますが常にありますスレッドは、
④この時点で、他のスレッド内にあるものは、ボックスを決定し、「(チケット> 0)があれば、」再び、しかし、直接の最新チケットを取得するために、操作を「ticket--」か判断してはいけません。
彼らは国家によって一種の判断①同時に発生する可能性があるため、常に「もし(チケット> 0)」の判断の前に行う「ticket--」スレッドは、まだ、スレッド安全性の問題が存在することになる場合であっても。

概要:揮発性フィールドのみの視認性を確保し、保証スレッドの安全性は、(並べ替え防止フィールド記事は、詳細な議論をしなかった)ことはできません並べ替えないようにします。

おすすめ

転載: blog.51cto.com/14528283/2452577