私は同期されたvolatile変数がjavaでどのように動作するかを調べています。この用語の意味を理解できる人は誰でも同期ブロック内の読み込み障壁と書き込みバリアは何ですか
答えて
コードの同期ブロックを入力すると「読み込みバリア」を渡し、終了すると「書き込みバリア」を渡します。
Isは、揮発性属性を参照する際に使用され、スレッドがvolatile属性の値を更新する必要がある場合に通知します。他の誰かが書き込み障壁を通過した場合、読み取りバリアを通過するときに更新する必要があります。
volatile属性から同様の読み込みを行うと、読み込みバリアが渡され、volatile属性に書き込むと書き込みバリアが渡されるため、同期ブロックよりはるかに粒度が大きくなります。
メモリバリアは、コンパイラが特定の最適化を行えないようにする概念的な "行"であり、特別な "同期アップ"コマンドをプロセッサに挿入することができます。通常、コンパイラは特定のメソッドを調べて、コードの意味を変えずに特定の命令を移動できることを確認できます。たとえば、あなたが
int x = 0, y = 0;
x++;
y++;
を持っている場合、コンパイラはx
とy
がするように、いくつかのクラスのフィールドである場合に、しかし
y++;
x++;
のためのいくつかの利点、それは可能性の代わりに、出力コードがあったことを考え出した場合それらは他のスレッドから見ることができ、他のスレッドはメソッドが実行されている間に値を変更している可能性があります。
メモリバリアは、特定の変数(Javaの場合、volatile
クラスとAtomic*
クラス)の値を再検査するよう強制します。メソッドが実行されている間に他のスレッドがそれらを変更した場合、コンパイラーが誤って計算の結果を変更する可能性のある並べ替えを作成しないようにします。複数のコア/プロセッサをサポートするシステムでは、コンパイラは他のプロセッサやハードウェアデバイスがその間に変数を変更していないことを確認するようにプロセッサに強制します。 Java(Java 5の場合)は、この動作の仕組みについて非常に明確に定義された規則セットを持っています。happens-beforeと呼ばれています。
This FAQには、Javaメモリモデルの開発時に書かれた有用な説明があります。メモリバリアの概念はクロスランゲージですが、ほとんどの言語ではJavaについてのルールが明確に定義されていないことに注意してください。
JVMが最低レベルでJavaメモリモデルのセマンティクスを実装するために、読み書きバリアが使用されています。
ただし、この用語はJava言語仕様にはありません。理由はという理由で、の関係の前にのみ発生します。特定
- に揮発性変数への書き込みが発生し、前
- 同じ変数の後続の読み取り同期ブロックが発生し、前と同じsyncchronizedブロック
の後続のエントリ出プログラム内の2つのアクションの間に先起こりの関係が存在する場合、その2つのアクションが順不同の順序で実行されるという保証があります。
JVMの実装の詳細を調べることで、正しいマルチスレッドプログラムを記述する必要はありません。しかし、もしあなたが詳細を知りたいのであれば、JSR-133 cookbookはおもしろいです。
(上記の答えはかなり完了している)、私は単純なスキーム
Thread 1 Thread 2
|
|
| |
| |
| Everything Thread 1 |
| wrote before here |
| |
| |
_ _ _ _ _ _ _ _ _ _ |
(write barrier) (happens before) (read barrier) |
| _ _ _ _ _ _ _ _
|
| is guaranteed |
| to be visible to |
| Thread 2 |
| |
- 1. 共有メモリC++読み込みと書き込みの同期
- 2. 読み取り/書き込み同期
- 3. 同時読み込み書き込み
- 4. Android内蔵ストレージの読み込み/書き込み同時に、
- 5. 同じFileStreamでの読み込みと書き込み
- 6. arduino書き込みと読み込み
- 7. ファイル読み込みと書き込み
- 8. Javaの同じファイルへの読み込みと書き込み
- 9. .netでのカードテーブルと書き込み障壁GC
- 10. アセンブリ内の読み込みと書き込みと整数ATT
- 11. SQLiteの同時読み込みと書き込み
- 12. 同時読み込みと書き込みの問題
- 13. カサンドラ同時読み込みと書き込み
- 14. MongoDBでの同時読み込み/書き込み
- 15. Javaでの同時読み込み/書き込みファイル
- 16. ブーストasio非同期の読み取りと書き込み
- 17. Hibernateでチャンク内のBLOBデータの読み込み/書き込み
- 18. オブジェクトの書き込み/読み込み
- 19. ブラウザのJavaScriptで同時読み込み/書き込み読み書きの衝突が可能ですか?
- 20. ADLAへの同時読み込み/書き込み
- 21. ファイルへの読み書きの高速読み込みと書き込み
- 22. エスプレッソとFirebase - 非同期読み込み
- 23. RecyclerViewと非同期読み込み
- 24. 辞書形式のテストファイルの書き込みと読み込み
- 25. InputStreamからの読み込みとOutputStreamへの書き込み
- 26. Dockerの読み込みと読み込みの違いは何ですか?
- 27. ローカルファイルからの書き込みと読み込みiPhone
- 28. cmd、txtからの書き込みと読み込み
- 29. iPhoneでのテキストファイルの書き込みと読み込み
- 30. システムコールのC言語での読み込みと書き込み
とコンセプトを実証したいあなたは[1787450](http://stackoverflow.com/questions/1787450)を見てみました? – ADTC
これを見てください:http://stackoverflow.com/questions/1787450/how-do-i-understand-read-memory-barriers-and-volatile – Saint
本当に有用なものです。ありがとうございました – csk