問題タブ [atomicreference]
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.
c# - C#アトミッククラスのフィールドを保護する方法は?
C# で AtomicReference クラスを作成しようとしていて、フィールド参照を保護したままにしたいのですが、get メソッドで値を返す必要もあります。
問題を回避するのは少し不器用です...フィールドを読み取り専用にすることはできません。それを設定できるようにする必要があるからです。私よりも良い解決策はありますか?
更新: 迅速な対応に感謝します! 単に _value を返すだけで参照が保護されることは当然指摘されました。また、_value が変化しないように保護したいと考えています。_value が AtomicReference の外で変化することを許可すると、このクラスを作成する目的全体が無効になります...それを達成する方法はありますか?
c# - Java の AtomicReference - スレッドセーフ環境で参照を設定するために必要ですか?
Java には AtomicReference クラスが存在します。これは、参照の設定自体がアトミック操作ではないことを意味しますか?
たとえば、これはスレッドセーフではありませんか (返された値を変更できないと仮定して)?:
C#ではどうですか?
java - Java参照を使用した競合状態
アトミック整数、long、booleanなどは、それぞれのタイプに対してアトミック更新を行うために使用されます。これは、++などの操作を実行するときに競合状態が発生する可能性があるためです。しかし、そのような競合状態が発生する可能性のある参照のさまざまなケースは何ですか?
よろしく、
ケシャフ
java - JavaでAtomicReferenceを使用するのはいつですか?
いつ使用しAtomicReference
ますか?
すべてのマルチスレッド プログラムでオブジェクトを作成する必要がありますか?
AtomicReference を使用する必要がある簡単な例を提供します。
optimistic-concurrency - myAtomicReference.compareAndSet(expected,new Date()) を実行する 2 つのスレッド
Q: 2 つのスレッドがそれを実行する場合、どのオブジェクトがアトミック参照に格納されますか?
マルチプロセッサ マシンでは、2 つのスレッドが同じクロック サイクルで CAS を実行できます。どちらも同じ myAtomicReference オブジェクトを使用して CAS を実行し、どちらも正しい値の "expected" を使用していますが、2 つの異なるオブジェクト、つまり 2 つの newDate を入れようとしているとします。そのうちの 1 つが失敗する必要がありますが、そのスレッドで myStatus は false になりますか?
CompareAndSwap の 1 つのハードウェア実装では、更新を行うためにスレッドをキューに入れると思います。2 つのプロセッサが同じクロック サイクルで CAS 命令を実行している場合でも、そのうちの 1 つが遅れている可能性があります。
java - アトミックに交換できる AtomicReference を作成できますか?
アトミックに別の値と交換できるタイプの参照を実装する方法はありますか?
Java では、AtomicReference
これをローカル変数と交換できますが、別の変数と交換することはできませんAtomicReference
。
できるよ:
2 つの操作の組み合わせでそれらを交換します。
しかし、これにより、両方に が含まれているという矛盾した状態になります"hello"
。また、それらをアトミックに交換できたとしても、(ペアとして) アトミックに読み取ることはできませんでした。
私ができるようにしたいのは:
それから
値を交換し、別のスレッドで:
[hello, world]
出力が または のいずれかになることを確認して[world, hello]
ください。
ノート:
r1
この操作ではとr2
がペアになっていますが、別のスレッドが独立してペアになる可能性があります (たとえばr1
、別のスレッドと) (残念ながら、このソリューションr3
を使用できないことを意味します)。- これらの参照は数十万になるため、グローバル
ReentrantLock
が大きなボトルネックになります。 rp
必ずしもスレッド間で共有されるとotherRP
は限らないため、単純にロックするだけでは機能しません。それらはインターンされる可能性がありますが、インターンプールには独自の同期が必要であり、これが別のボトルネックになります。- ここでは 2 つの参照のグループしか作成していませんが、3 つ以上をグループ化する機能はおまけです。
のロックフリーバージョンを実装することは可能AtomicRefPair
ですか? そうではないという予感がありますが、そうでない場合は、その理由を説明する記事がどこかにあるのではないでしょうか?
java - 任意の複製可能なデータのスレッドセーフなホルダー
SomeMutableData
publicclone()
メソッドを持つクラスがあります。一貫性のない状態がスレッドに表示されないようにしたいと思います (インスタンスがホルダーのみを使用して渡されると仮定します)。同期を使用することが最も安全な可能性だと思いますよね?
以下は最初のアプローチと同じくらい安全ですか?
java - AtomicReferenceFieldUpdater-メソッドset、get、compareAndSetセマンティクス
JavaAtomicReferenceFieldUpdater
ドキュメントから:
このクラスのメソッドの保証は、
compareAndSet
他のアトミッククラスよりも弱いことに注意してください。このクラスは、フィールドのすべての使用がアトミックアクセスの目的に適切であることを保証できないため、およびの他の呼び出しに関してのみ、アトミック性と揮発性セマンティクスを保証できcompareAndSet
ますset
。
つまり、通常の揮発性書き込みをと一緒に実行することはできませんが、代わりcompareAndSet
に使用する必要があります。set
については何も言及していませんget
。
それは、同じ原子性の保証で揮発性フィールドをまだ読み取ることができることを意味します-set
またはの前にすべての書き込みcompareAndSet
があり、揮発性フィールドを読み取ったすべての人に表示されますか?
または、フィールドでの揮発性読み取りget
の代わりにを使用する必要がありますか?AtomicReferenceFieldUpdater
参考文献をお持ちの場合は投稿してください。
ありがとうございました。
編集:
Java Concurrency in Practiceから、彼らが言うのは次のことだけです。
アップデータクラスのアトミック性の保証は、基になるフィールドが直接変更されないことを保証できないため、通常のアトミッククラスよりも弱くなります。compareAndSetメソッドと算術メソッドは、アトミックフィールドアップデータメソッドを使用する他のスレッドに関してのみアトミック性を保証します。
繰り返しますが、他のスレッドがこれらの揮発性フィールドを読み取る方法については言及されていません。
また、「直接変更」は通常の揮発性書き込みであると想定するのは正しいですか?
java - 可変オブジェクトと可視性への AtomicReference
AtomicReference
オブジェクトのリストがあるとします:
スレッド Aは、このリストに要素を追加します。batch.get().add(o);
後で、スレッド Bがリストを取得し、たとえば、DB に格納します。insertBatch(batch.get());
書き込み時 (スレッド A) と読み取り時 (スレッド B) に追加の同期を実行して、スレッド B が A が残した方法でリストを確認できるようにする必要がありますか? それとも、これは AtomicReference によって処理されますか?
言い換えれば、可変オブジェクトへの AtomicReference があり、1 つのスレッドがそのオブジェクトを変更した場合、他のスレッドはこの変更をすぐに認識しますか?
編集:
たぶん、いくつかのサンプルコードが適切です:
ここでは、4 つのワーカー スレッドを作成してテキストを解析します (これはメソッドのReader in
パラメーターprocess()
です)。各ワーカーは、解析した行をバッチに保存し、満杯になるとバッチをフラッシュします ( dao.insertBatch(batch.getAndSet(new ArrayList<Object>(batchSize)));
)。
テキストの行数はバッチ サイズの倍数ではないため、最後のオブジェクトは、満杯ではないため、フラッシュされないバッチになります。したがって、これらの残りのバッチは、メイン スレッドによって挿入されます。
AtomicReference.getAndSet()
完全なバッチを空のバッチに置き換えるために使用します。このプログラムはスレッドに関して正しいですか?
android - タブホストを介してメインアクティビティへの参照を作成する方法
アプリケーションのタブホストからこの特定のクラスへの参照を作成する必要があります。この参照を作成する理由は、この特定のクラスのいくつかの値にアクセスするためです。しかし、タブホストアクティビティでコンストラクターを作成すると、java.lang.instantiaionexceptionをインスタンス化できませんというランタイム例外がスローされます。
03-21 10:17:29.382:E / AndroidRuntime(7637):java.lang.RuntimeException:アクティビティをインスタンス化できませんComponentInfo {com.LiveGuardRSU / com.LiveGuardRSU.LiveGuardRSUSettingsTabHost}:java.lang.InstantiationException:com.LiveGuardRSU.LiveGuardRSUSettingsTabHost