問題タブ [java-memory-model]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - なぜこの Java プログラムは終了するべきではない (そして終了しない) にもかかわらず終了するのでしょうか?
今日、私の研究室で機密扱いの操作が完全に失敗しました。電子顕微鏡のアクチュエーターが限界を超え、一連の出来事の後で 1,200 万ドルの機器を失いました。障害のあるモジュールの 40,000 行以上を次のように絞り込みました。
私が得ている出力のいくつかのサンプル:
ここには浮動小数点演算がなく、符号付き整数が Java のオーバーフロー時に適切に動作することは誰もが知っているので、このコードに問題はないと思います。ただし、プログラムが終了条件に達しなかったことを示す出力にもかかわらず、プログラムは終了条件に達しました (到達したか、到達していないか?)。なんで?
これは一部の環境では発生しないことに気付きました。私は64 ビット LinuxでOpenJDK 6 を使用しています。
java - Java Puzzler: ビジー待機スレッドが機能しなくなる
これはある種の Java Puzzler で、私が偶然見つけたもので、実際には説明できません。たぶん誰かができますか?
次のプログラムは、しばらくするとハングします。2 回出力した後、80 回出力した後ということもありますが、ほとんどの場合、正しく終了する前に発生します。初めて実行しない場合は、数回実行する必要がある場合があります。
ここで、ビジーな待機ループが一般的には良い考えではないことは明らかです。しかし、これは改善ではなく、何が起こっているのかを理解することです。
フィールドが に設定されている場合、またはフィールドが に設定されているWorkerThread.setWork()
場合、すべてが期待どおりに機能するため、メモリの問題が疑われます。synchronized
WorkerThread.workToDo
volatile
しかし、なぜそれが起こっているのでしょうか?デバッグは役に立ちません。ステップスルーを開始すると、すべてが期待どおりに動作します。
説明をいただければ幸いです。
android - Android の最大 BackStack サイズ
私はアンドロイド開発の初心者です。AndroidのBackStackの最大メモリ サイズを
知りたいAndroid アプリケーションのアクティビティをBackStackに保存できる数を知りたい
ありがとう
java - volatile 変数を使用して単純なスレッドセーフなクラスを作成する方法は?
整数値を設定または取得するために使用できる単純なスレッド セーフなクラスを作成したいと考えています。
最も簡単な方法は、synchronizedキーワードを使用することです。
volatileを使用することもできます:
volatileキーワードを持つクラスはスレッドセーフですか?
次の一連のイベントを検討してください。
- スレッド A は値を 5 に設定します。
- スレッド B は値を 7 に設定します。
- スレッド C が値を読み取ります。
Java 言語仕様から、
- "1"は"3"の前に発生します
- "2"は"3"の前に発生します
しかし、「1」が「2」の前に発生するという仕様からどのように続くかわかりません。そのため、「1」は「2」の前に発生しない と思われます。
スレッド C は 7 または 5 を読み取る可能性があると思います。volatileキーワードを持つクラスはスレッドセーフではなく、次のシーケンスも可能だと思います。
- スレッド A は値を 5 に設定します。
- スレッド B は値を 7 に設定します。
- スレッド C は 7 を読み取ります。
- スレッド D は 5 を読み取ります。
- スレッド C は 7 を読み取ります。
- スレッド D は 5 を読み取ります。
- ...
MyIntegerHolder with volatileはスレッドセーフではないと仮定するのは正しいですか?
AtomicInteger を使用してスレッドセーフな整数ホルダーを作成することは可能ですか?
?
以下は、『Java Concurrency In Practice』の一部です。
"アトミック変数の読み取りと書き込みは、揮発性変数と同じメモリ セマンティクスを持ちます。 "
スレッドセーフなMyIntegerHolderを記述する最良の (できればノンブロッキングの) 方法は何ですか?
答えを知っているなら、それが正しいと思う理由を知りたいです。仕様通りですか?もしそうなら、どのように?
java - 揮発性読み取りは揮発性書き込みの前に発生しますか?
この例が正しく同期されたプログラムである理由を理解しようとします。
競合するアクセスがあるため (a への書き込みと読み取りがあるため)、すべての順次整合性において、実行はそのアクセス間の先行発生関係でなければなりません。順次実行の 1 つを想定します。
1 が 2 の前に発生するのはなぜですか?
java - 揮発性と同期を使用する場合、さまざまなスレッドにフラッシュまたはパブリッシュされるメモリの範囲はどのくらいですか?
この質問は、メモリの可視性のみに関連しており、発生前および発生後ではありません。Java には、あるスレッドのメモリへの変更が別のスレッドから見えるようにすることを保証する 4 つの方法があります。(参照http://gee.cs.oswego.edu/dl/cpj/jmm.html )
- 書き込みスレッドが同期ロックを解放し、その後、読み取りスレッドが同じ同期ロックを取得します。
- フィールドが volatile として宣言されている場合、書き込みスレッドがさらにメモリ操作を実行する前に、そのフィールドに書き込まれた値はすべてフラッシュされ、書き込みスレッドによって可視になります (つまり、当面の目的のためにすぐにフラッシュされます)。
- スレッドがオブジェクトのフィールドに初めてアクセスすると、フィールドの初期値か、他のスレッドによって書き込まれた後の値が表示されます。
- スレッドが終了すると、書き込まれたすべての変数がメイン メモリにフラッシュされます。
Java Concurrency in Practice によると、そのような質問に関する聖書:
volatile 変数の可視性効果は、volatile 変数自体の値を超えて拡張されます。スレッドAが揮発性変数に書き込み、続いてスレッドBが同じ変数を読み取ると、揮発性変数に書き込む前にAに表示されていたすべての変数の値は、揮発性変数を読み取った後にBに表示されます。
揮発性の質問
これは、 AからCではなく A から B にメモリをフラッシュする方法を知るために、JVM が実際に volatile 変数の読み取りと書き込みを追跡することを意味しますか? したがって、 Aが変数に書き込み、後でCが変数から読み取り、その後Bが変数から読み取り、フラッシュはAとBおよびAとCの間でスレッドごとに行われますが、BとCは行われませんか? または、スレッドに関係なく、キャッシュされたすべてのメモリがフラッシュされることを意味しますか? volatile 変数のみがフラッシュされますか、それともキャッシュされたメモリはすべてフラッシュされますか?
同期質問
キーワード flushing の場合synchronized
、ロック内で更新されたメモリのみが他のスレッドに公開されることが保証されます。これは、次のコードで を実行している 2 つのスレッドがmethod()
、同期ブロックを離れてstaticVar2
他のスレッドにフラッシュすることを意味しますが、そうではありません staticVar1
。正しいですか?
また、 では、別のスレッドが実行されている場合method2()
、同期をdifferentLock
行うと、事前発生後発生の問題が発生する可能性がありますmethod()
。ただし、問題は視認性です。スレッドAが実行さmethod
れ、その後スレッドBが実行された場合、2 つのスレッドが同じロックを介して同期していなくても、AからBに発行されmethod2()
た値は?staticVar2
静的な質問
が他のスレッドに更新されない場合staticVar1
、プログラム内のすべての静的変数は宣言を必要とするか、ブロックvolatile
内でのみアクセスする必要があるようです。synchronized
かなり厳しいように見えますが、正しいですか?私の時代に、同期されていない静的変数がたくさんあるのを見たことがあります。
要約すれば
- 揮発性の読み取り/書き込みは、すべてのメモリをすべてのスレッドにフラッシュしますか、それともアクセスしている 2 つのスレッド間のみにフラッシュしますか? 答えが何であれ、すべてのメモリがフラッシュされるか、揮発性変数のみがフラッシュされますか?
- 同期されたブロックを終了するときに変更されたすべてのメモリがフラッシュされますか、それともブロック内で変更されたメモリだけですか? すべてのメモリがフラッシュされていない場合、値を確認するには、スレッドが同期するロック オブジェクトが同じである必要がありますか (つまり、ロック オブジェクトはメモリの可視性に何らかの影響を与えますか)?
- 2 つのスレッドがアクセスするすべての静的変数を同期する必要がありますか?
java - Javaの新しいメモリモデルの前発生は、揮発性として宣言されたオブジェクトのメンバーにも適用されますか?
新しい Java メモリ モデルでは、変数への書き込みは、次のスレッドが読み取る前に完了することが保証されています。
これは、このオブジェクトのメンバーである変数にも当てはまりますか?
Java メモリ モデルの場合:
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
例えば
上記のコードのように、functionMap
volatile にしても、このメソッドが戻る前に関数オブジェクトが完全に構築されることは保証されません。
私の考えは正しいですか?
また、このトピックについては、次の点について私の考えが正しいかどうかを確認してください。
以下のように、 への書き込みはfunctionMap
、 の参照を変更する前に完了することが保証されていますfunctionMap
よね? メソッドの実行にどれだけ時間がinitializeMap
かかっても、他のスレッドには nullfunctionMap
または完全に初期化されたfunctionMap
?が表示されます。
上記を明確にするために、上記の 2 つの例はすべてマルチスレッド環境にあり、functionMap 変数は複数のスレッドによってアクセスされます。