問題タブ [happens-before]
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.
scala - Akka コンテキストの監視/監視解除の先行発生関係
親 Pと子 Cの 2 つのアクターに対して、次の一連のアクションがあります。
- P時計C (
context watch c
) - P unwatches C (
context unwatch c
) - PはCを優雅に止めます(
c ! PoisonPill
)
私が知りたいのは; Pが Cのイベントを受信しないことは保証されていますか?Terminated
これがコードのサンプルです
java - Happensの確立-以前はアレイで
同期に関する簡単な質問があります。これが私が持っているものです。
a)Class1には、次のように定義された同時ハッシュマップがあります。
b)Class2には、Thread1と呼ばれるスレッドがあります。Thread1はIDを作成し、マップにIDが含まれているかどうかを確認します。含まれている場合は、値(int [] [])を取得し、内容を変更して元に戻します。そうでない場合は、新しいint [] []を作成し、それを格納します。このチェック->変更/作成のプロセスは頻繁に発生します。
c)最後に、Thread2という別のスレッドがあります。このスレッドはIDを受け取り、マップにその値があるかどうかを確認します。そうでない場合、何も起こりません。含まれている場合は、int [] []の値を合計し、その数値を計算に使用します(ここでは変更はありません)。
私は自分の操作がアトミックであるかどうかを理解しようとしています。b)の操作は、配列の作成/変更とマップへの挿入が1つのスレッド(Thread1)のみに制限されているため問題ありません。
また、マップへの挿入により、発生前のアクションが確立されるため、c)がint[][]で更新された値を確認できるようになります。
ただし、Thread2がマップ内で同じint [] []を検索し、Thread1が変更しているときにそれを合計しようとすると、どうなるかわかりません。
Thread2がint[][]に古い(ただし破損していない)値を表示すると考えるのは正しいですか。その理由は、Thread1が値をマップに戻すのが完了するまで、新しい変更はThread2に表示されないためです。
どうもありがとう。
java - メモリの一貫性 - Java の事前発生関係
メモリ整合性エラーに関する Java ドキュメントを読んでいる間。関係の前に発生する2つのアクションに関連するポイントを見つけました:
ステートメントが を呼び出す
Thread.start()
と、そのステートメントと先行発生関係を持つすべてのステートメントは、新しいスレッドによって実行されるすべてのステートメントとも先行発生関係を持ちます。新しいスレッドの作成につながったコードの効果は、新しいスレッドに表示されます。スレッドが終了し
Thread.join()
、別のスレッドの a が返されると、終了したスレッドによって実行されたすべてのステートメント は、結合が成功した後の
すべてのステートメントとの先行発生関係を持ちます。
スレッド内のコードの効果は、結合を実行したスレッドに表示されるようになりました。
私はそれらの意味を理解することができません。誰かが簡単な例で説明してくれると助かります。
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 変数は複数のスレッドによってアクセスされます。
java - Java の事前発生と同期
Java の事前発生と同期については、少し意見の相違があります。
次のシナリオを想像してください。
メインスレッド
その他のスレッド
のインスタンス変数はでも でもMyObject
ないことに注意してください。のメソッドは同期を使用しません。volatile
final
MyObject
私の理解では、次のとおりです。
1は 3の前に発生 します。これは、同じモニターで同期が行われ、他のスレッドが2でのみ生成され、 1の後に実行されるためです。
4に対するアクションは、すべてのスレッドに対してさらに同期が行われ、メイン スレッドがこれらのアクションの後に何らかの方法で同期しない限り、後でメイン スレッドに表示されるという保証はありません。
Q: 0でのアクションが表示され、前に発生し、 3で同時アクセスされるという保証はありますか?それとも、変数を として宣言する必要がありますvolatile
か?
ここで、次のシナリオを検討してください。
メインスレッド
その他のスレッド
私の理解では、次のとおりです。
1 前と同じように3の前に発生します。
が保持するでの同期により、 4でのアクションは他のスレッド間で表示されます。
ReentrantLock
MyObject
4に対するアクションは論理的に3の後に発生しますが、別のモニターで同期した結果として、3から4への先行発生の関係はありません。
4
sharedMonitor
の後unlock
に同期があったとしても、上記の点は当てはまります。メインスレッドが他のタスクの終了を待っている場合でも、4のアクションは5のアクセスの前に発生しません。これは、5へのアクセスが と同期されていないためです。そのため、メイン スレッドには古いデータがまだ表示される場合があります。
o.lock()
Q:私の理解は正しいですか?
java - 「部分順序付け」と前発生関係 java
Java Concurrency in Practiceを読んでいます
事前発生関係に関する特定の説明と混同しています。
それは、
操作は、事前発生と呼ばれる部分順序付けによって順序付けられます
これは、 「部分的な順序付け」とは正確にはどういう意味ですか?
(本に説明はありますが、私にはわかりません)