は、下記からダウンロード(Javaいます。Net)プログラムに、なっているのでしょうかをコピー可変が原子?
-
19-08-2019 - |
質問
どんなレースの条件を用い設計時かと思っています。
ということかして大型の配列やコレクションの並べ替えにより管理されている一部のプログラム、電話そのコンポーネント。その仕事は、定期的に確認しますが、コレクションが"汚染"としていe.を変更して、その場合、スナップショットをハードディスク(これは、検査場を用いた場合クラッシュが発生し、マークとしてクリーンです。
その他のコンポーネントと同じプログラムを走らに別のスレッドはモニターの方法でデータを追加または変更データの配列。これらのメソッドマークのコレクションに汚れています。
現在、改変方法の他成分'のスレッドですよね?ばんなので、運が良けれをベースとして取り入れているのがスナップショットディスクに書き込まれ、変更データで記述は、汚れたフラグおよびモニターのスレッド設定解除でこれをせずに保存され、変更はすでに要素がいします。くらいなので、汚れたコレクションの表示をしてます。
なと思ったか問題解決による一時的なコピーのマークで、そのとserializeにコピーします。での複写する原子ます。e.できまっていることをご確認くださいコレクション変わらないのが今のコピーです。
この間、と思い、思ったより良いソリューションのように、
- 設定のロックフラグを始める前に書き込むディスクのデータの変更方法まで待フラグが設定を解除
- のデータの変更方法書変更のキューにたくさんのコレクションにとってのスレッドのディスクに書き込み処理がキュー
と思い、ロックフラグが最良の方法です。 だが、やはりん:はコピー可変の原子?
フォロー:この進むべき問題が実際にでも同じです。に応じて答え以下、"ロックフラグ"アプローチが動作しない。データが改変方法もチェック、ロックフラグが設定されている、"ロック"の値を決めるのではないロックされています。ながらやっていく必要がある特殊な建設のようなミューテックスがいいですよね?
カレッジ エリクソン その も答え 私のフォローアップがなされている。私はこの二つの質問も受け付けている"との回答が増加.ご投票んです。
解決
No.例えば、長変数にJavaない原子32-bitます。
また、"スレッドのキャッシング問題の場合変数は、揮発性又は内部で同期をブロックが別のスレッドはこの変数の値です。これは全ての種類の変数だけでなく、長い。
こちら: http://gee.cs.oswego.edu/dl/cpj/jmm.html, 特に"atomicity"および"見える化"努めます。
他のヒント
かせない原子. この質問 なぜ"、"どうするかということです。
見 java.util.兼職の状況.原子 こす可能性があるが、これをいくつかの良いものにすることができます。
必要なものを懸念するの視認性の変更その他のスレッドの場合、JVM.一般的に、ただくの課題内 synchronized
ブロック、または変数のべき volatile
, ごを使用する必要があります変数のラッパーからの java.util.concurrent.atomic
パッケージです。
しかし、このケースではそのようにしてくだ一つのスレッドがもクリアに"汚れ"フラグ—スレッドに、そのデータです。そうなると、クリア、フラグ 前 データを書き込む.場合は他のスレッドに設定し ながら 書いていのデータで設定で次の予定です。思用 AtomicBoolean
, をお持続スレッドatomicityとの確認フラグおよび清算です:
private final AtomicBoolean dirty = new AtomicBoolean();
/**
* Any method that modifies the data structure should set the dirty flag.
*/
public void modify() {
/* Modify the data first. */
...
/* Set the flag afterward. */
dirty.set(true);
}
private class Persister extends Thread {
public void run() {
while (!Thread.interrupted()) {
if (dirty.getAndSet(false)) {
/* The dirty flag was set; this thread cleared it
* and should now persist the data. */
...
}
}
}
}
設定32ビット(少なくとも。純額)は原子力するものではありません。いて読んでみたいんだロックですと、読んで、後の、読み込みに他の誰かがそれを読み上げ前の設定も可能ですので、二つのスレッドが終わ 内部 に保護されたコードです。のは、まさにこのような実際の同期オブジェクト(います。純モニタークラス)を割り当てるべきなのです。き用の連動をチェックを増加させるロック可変します。
によって左右のハードウェアおよびJVMが実行
一部のハードウェアおよび一部のJVMs一部コピーする原子 ってより安全なものにしようとする仮の場合はこの限りではありませんも単純な整数を整数で割ることができる機械の説明x856ます。
文字列と配列にコピーできる配列の指示 では二つのスレッドを更新simultaniously.
私の理解ではない。
Int32ますので、Int64な32ビットシステムでのニーズ2x32ビット.そのため、大きな一つ32ビットまたは細胞です。