問題タブ [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.

0 投票する
2 に答える
831 参照

c# - C#アトミッククラスのフィールドを保護する方法は?

C# で AtomicReference クラスを作成しようとしていて、フィールド参照を保護したままにしたいのですが、get メソッドで値を返す必要もあります。

問題を回避するのは少し不器用です...フィールドを読み取り専用にすることはできません。それを設定できるようにする必要があるからです。私よりも良い解決策はありますか?

更新: 迅速な対応に感謝します! 単に _value を返すだけで参照が保護されることは当然指摘されました。また、_value が変化しないように保護したいと考えています。_value が AtomicReference の外で変化することを許可すると、このクラスを作成する目的全体が無効になります...それを達成する方法はありますか?

0 投票する
5 に答える
2876 参照

c# - Java の AtomicReference - スレッドセーフ環境で参照を設定するために必要ですか?

Java には AtomicReference クラスが存在します。これは、参照の設定自体がアトミック操作ではないことを意味しますか?

たとえば、これはスレッドセーフではありませんか (返された値を変更できないと仮定して)?:

C#ではどうですか?

0 投票する
3 に答える
566 参照

java - Java参照を使用した競合状態

アトミック整数、long、booleanなどは、それぞれのタイプに対してアトミック更新を行うために使用されます。これは、++などの操作を実行するときに競合状態が発生する可能性があるためです。しかし、そのような競合状態が発生する可能性のある参照のさまざまなケースは何ですか?

よろしく、
ケシャフ

0 投票する
8 に答える
205250 参照

java - JavaでAtomicReferenceを使用するのはいつですか?

いつ使用しAtomicReferenceますか?

すべてのマルチスレッド プログラムでオブジェクトを作成する必要がありますか?

AtomicReference を使用する必要がある簡単な例を提供します。

0 投票する
2 に答える
99 参照

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 つが遅れている可能性があります。

0 投票する
2 に答える
2207 参照

java - アトミックに交換できる AtomicReference を作成できますか?

アトミックに別の値と交換できるタイプの参照を実装する方法はありますか?


Java では、AtomicReferenceこれをローカル変数と交換できますが、別の変数と交換することはできませんAtomicReference

できるよ:

2 つの操作の組み合わせでそれらを交換します。

しかし、これにより、両方に が含まれているという矛盾した状態になります"hello"。また、それらをアトミックに交換できたとしても、(ペアとして) アトミックに読み取ることはできませんでした。


私ができるようにしたいのは:

それから

値を交換し、別のスレッドで:

[hello, world]出力が または のいずれかになることを確認して[world, hello]ください。

ノート:

  • r1この操作ではとr2がペアになっていますが、別のスレッドが独立してペアになる可能性があります (たとえばr1、別のスレッドと) (残念ながら、このソリューションr3を使用できないことを意味します)。
  • これらの参照は数十万になるため、グローバルReentrantLockが大きなボトルネックになります。
  • rp必ずしもスレッド間で共有されるとotherRPは限らないため、単純にロックするだけでは機能しません。それらはインターンされる可能性がありますが、インターンプールには独自の同期が必要であり、これが別のボトルネックになります。
  • ここでは 2 つの参照のグループしか作成していませんが、3 つ以上をグループ化する機能はおまけです。

のロックフリーバージョンを実装することは可能AtomicRefPairですか? そうではないという予感がありますが、そうでない場合は、その理由を説明する記事がどこかにあるのではないでしょうか?


関連: C# で 2 つの int をアトミックに交換するにはどうすればよいですか?

0 投票する
1 に答える
415 参照

java - 任意の複製可能なデータのスレッドセーフなホルダー

SomeMutableDatapublicclone()メソッドを持つクラスがあります。一貫性のない状態がスレッドに表示されないようにしたいと思います (インスタンスがホルダーのみを使用して渡されると仮定します)。同期を使用することが最も安全な可能性だと思いますよね?

以下は最初のアプローチと同じくらい安全ですか?

0 投票する
3 に答える
4039 参照

java - AtomicReferenceFieldUpdater-メソッドset、get、compareAndSetセマンティクス

JavaAtomicReferenceFieldUpdaterドキュメントから:

このクラスのメソッドの保証は、compareAndSet他のアトミッククラスよりも弱いことに注意してください。このクラスは、フィールドのすべての使用がアトミックアクセスの目的に適切であることを保証できないため、およびの他の呼び出しに関してのみ、アトミック性と揮発性セマンティクスを保証できcompareAndSetますset

つまり、通常の揮発性書き込みをと一緒に実行することはできませんが、代わりcompareAndSetに使用する必要があります。setについては何も言及していませんget

それは、同じ原子性の保証で揮発性フィールドをまだ読み取ることができることを意味します-setまたはの前にすべての書き込みcompareAndSetがあり、揮発性フィールドを読み取ったすべての人に表示されますか?

または、フィールドでの揮発性読み取りgetの代わりにを使用する必要がありますか?AtomicReferenceFieldUpdater

参考文献をお持ちの場合は投稿してください。

ありがとうございました。

編集:

Java Concurrency in Practiceから、彼らが言うのは次のことだけです。

アップデータクラスのアトミック性の保証は、基になるフィールドが直接変更されないことを保証できないため、通常のアトミッククラスよりも弱くなります。compareAndSetメソッドと算術メソッドは、アトミックフィールドアップデータメソッドを使用する他のスレッドに関してのみアトミック性を保証します。

繰り返しますが、他のスレッドがこれらの揮発性フィールドを読み取る方法については言及されていません。

また、「直接変更」は通常の揮発性書き込みであると想定するのは正しいですか?

0 投票する
4 に答える
3029 参照

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()完全なバッチを空のバッチに置き換えるために使用します。このプログラムはスレッドに関して正しいですか?

0 投票する
2 に答える
108 参照

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