問題タブ [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 メモリ モデルは Java 全体または実際に JVM 全体に適用されますか?
Java-Memory-Model と呼ばれることはよくありますが、これまでは本能的に JVM エコシステム全体に適用できると考えていました。
Javaで作成されたアプリケーション間でのみ適用されますか?それとも、バイトコードJVM準拠の実行可能ファイルもその保証から恩恵を受けますか?
「メモリモデル」でJVM仕様を調べましたが、それについて多くを見つけることができませんでした。一方で、Java の仕様書には徹底的に記述されており、メモリ モデルが Java 固有のものであるという印象が残ります。
ありがとう
java - 共有メモリ (int) と Java スレッドの同期
私たちのアプリ (Java for Android で作成) にThread
は、int フィールドを含む派生クラスがあります。
MyThread
クラスは int フィールドからのみ読み取りますが、別のスレッドに書き込みたいのですが (上記の例のように)。
私が知っているように、Java の int などのプリミティブ型はアトミックに読み書きされます。
synchronized
この int フィールドへのアクセスを (キーワードを使用して) 保護する必要がありますか?
Java メモリ モデルによると、いくつかのスレッドによって共有されるメモリへの更新は、明示的に伝達されない限り、見られない可能性があることをここで読みました。
引用:明示的な通信がなければ、他のスレッドがどの書き込みを認識できるかを保証できません
このフィールドへのアクセスを保護する必要がありますか、それとも別のスレッドで必要な変更を行わずに (原子的に) 更新できますか?
java - データベースオープナーでの同時実行
適切な同時操作を行う方法がわからないので、コードを調整しようとしました。そして、コンストラクターでの並行性と、静的な最終フィールドとの並行性が完全に失われました...
//私のopenhelperクラス
これは私がスレッドで使用している方法です:
私が望むのは、他のインスタンスが作業している場合、まったく同じデータベースを閉じてはならないということです。
どんな助けでも大歓迎です。
java - Javaでダブルチェックロックベースのシングルトンを使用しても安全ですか?
ウィキペディアにリストされている Java でのシングルトンの実装の 1 つがあります。
Java 言語仕様 17 のパラグラフ 5 に次のように記載されています。
コンストラクターが終了すると、オブジェクトは完全に初期化されたと見なされます。オブジェクトが完全に初期化された後にのみオブジェクトへの参照を確認できるスレッドは、そのオブジェクトの final フィールドの正しく初期化された値を確認できることが保証されます。
では、SingletonDemo クラスに非 final フィールドがあるとします。したがって、並行スレッドは、コンストラクターで指定された正しい値ではなく、デフォルト値を読み取ることができますか?
java - Java - 前に発生 - 揮発性
私は以下のコードを持っています
複数のスレッドから同じオブジェクトを呼び出すとincrement()
、次の出力が得られます (マシンによって異なる場合があります)。
最初の 3 つの数値(2 3 2) を考慮すると、スレッドが 3 を認識した場合、インクリメントが発生し、変数が揮発性であるため、その値は 3 以上である必要がありますが、どのスレッドでも 2 にすることはできません。
ただ、ここで印刷行が並び替えられているようですが、その行を並び替えて正しいでしょうか?ここで何が欠けていますか?私はJDK 7(Eclipse)で実行しています
java - volatile 変数が単純な同期よりもはるかに効率的である理由
揮発性変数の使用は、それを使用するときはいつでも同期ブロックを使用するよりもはるかに効率的であると言われています(読み取りまたは書き込み)。
Java 1.4 までは、その理由がわかりました (当時は、スレッドがすべてのアクセス可能なメモリをフラッシュおよびリフレッシュする必要がなかったからです)。
しかし、Java 1.5 以降、volatile 変数と同期ブロックの使用に見られる唯一の違いは、ロック取得メカニズムです。
ロックを取得するのは本当にそれほど高価ですか? もしそうなら、それはなぜですか?
java - あるスレッドでの非揮発性メンバー変数への割り当ては、別のスレッドで見られることが保証されていますか?
以下の Java の例を考えてみましょう。どちらのクラス メンバー変数も宣言されていないことに注意してくださいvolatile
。メモリ モデルと "前に起こる" ルールを正しく理解している場合、Java 実装はrun()
メソッドを最適化して、別のスレッドがメソッドを呼び出した場合でもメソッドが永久に実行されるようにすることができstopNow()
ます。これは、スレッドに複数回run()
の値の読み取りを強制するメソッドが何もないために発生する可能性があります。stop
あれは正しいですか?そうでない場合、なぜですか?
java - 同期は、スレッドが別のスレッドによって変更されている不揮発性変数の最新の値を確認することを保証しますか?
以下に簡単な例を示します。
counter
したがって、変数は不揮発性であるため、CPUキャッシュにスタックされた値ではなく、の適切な値を取得したいだけです。目標は、カウンターを揮発性にしないことです。そのため、インクリメントを行うスレッド A には影響しませんが、変数を読み取るときに気にしないスレッド B のみに影響します。
記録のために、counter
スレッド A がとにかく終了したときに、スレッド B から の値を読み取る予定です...