問題タブ [atomicboolean]
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 - AtomicBoolean を使用した Java のラウンド ロビン スケジューリング アルゴリズム
外部システムにリクエストを送信するときに、厳密なラウンド ロビン スケジューリングを実装したいと考えています。2 つの外部システム サーバーがあります。最初のリクエストは「System1」に送信され、2 番目のリクエストは「System2」に送信され、次のリクエストは「System1」に送信される必要があります。
リクエストを送信するサーバーが 2 つしかないため、ブロッキングやコンテキスト スイッチを使用せずに最大のパフォーマンスが必要なため、CAS 操作を利用するため、AtomicBoolean を選択しました。
私の実装クラス
1. RoundRobinTest.java
2.RoundRobinLogic.java (静的 AtomicBoolean オブジェクトを持つクラス)
出力:
リクエスト 318 と 319 は同じサーバーに送信されており、このシナリオでは AtomicBoolean が失敗します。私のアプリケーションでは、一度に 1000 ~ 2000 のスレッドが共有オブジェクトにアクセスしている可能性があります。実際のJava並行性から、私は以下を見てきました。
競合レベルが高い場合、ロックはアトミック変数よりもパフォーマンスが優れている傾向がありますが、より現実的な競合レベルでは、アトミック変数がロックよりもパフォーマンスが優れています。これは、ロックが競合に反応してスレッドを一時停止し、共有メモリ バス上の CPU 使用率と同期トラフィックを削減するためです。 低から中程度の競合で、アトミックはより優れたスケーラビリティを提供します。競合が多い場合、ロックはより優れた競合回避を提供します。(単一 CPU システムでは、CAS ベースのアルゴリズムはロック ベースのアルゴリズムよりもパフォーマンスが優れています。これは、読み取り変更書き込み操作の途中でスレッドが横取りされるというまれなケースを除いて、CAS は常に単一 CPU システムで成功するためです。)
今、私は以下の質問があります。
- ラウンドロビン要求の送信を実現するために、他の効率的なノンブロッキングの方法はありますか。
- 競合が激しい場合、AtomicBoolean が失敗する可能性はありますか? 私が理解しているのは、競合が激しいためにパフォーマンス/スループットが低下する可能性があるということです。しかし、上記の例では AtomicBoolean は失敗します。なんで ?
java - 同期ブロックの代わりに AtomicBoolean を使用する
2つのインスタンス変数と次のメソッドを持つクラスがあるとします(この質問のために簡略化されています):
私はこのコードを見ていて、 について読んだAtomicBoolean
後、特にMyClass
コンストラクターとmethodA
. よくわからなかったmethodB
けど。
これらのメソッドが複数のスレッドから呼び出される可能性があると仮定すると、次のメソッドはスレッドセーフになりますか?:
別のスレッド経由または別のスレッドからrunning.get()
の更新が表示されることが保証されますか?running.set(true)
running.set(false)
java - AtomicBoolean の hashCode とは何ですか?
公式ドキュメントには情報が見つかりませんでした。Boolean.hashCode(boolean b)
true と false の 2 つの素数 1231 と 1237 を返すことはわかっています。での同様の実装を期待していAtomicBoolean
ます。しかし、逆コンパイルされたクラスファイルでは、の呼び出しpublic native int hashCode();
のように見えますObject
-それは、メモリの場所を返すことを意味しますか?
java - get() および set() メソッドのみが使用されている場合、AtomicBoolean をプリミティブ型に置き換えますか?
私のコードにはいくつかのAtomicBoolean
フィールドが含まれています。get()
これらのフィールドのおよびset()
メソッドのみが呼び出されます。
これらのフィールドの型をプリミティブ ブール値で安全に置き換えることはできますか?
つまり、プリミティブブール値の割り当て操作とアクセス操作は、Java のアトミック操作です。そして、その観点からAtomicBoolean
、私の場合に使用する理由はわかりません。
私の理解では、比較とアクセスを組み合わせたAtomicBoolean
ような方法が使用されている場合にのみ意味があります。compareAndSet
私はそれについて間違っていますか?理由を説明していただけますか?
swift - Swift 3 - アトミックブール値
iOS 10でアトミックブール値を作成する方法を知っている人はいますか?
現在のコード:
コードは期待どおりに機能しますが、警告が表示され続けます:
atomic_fetch_or_explicit(memory_order_relaxed) で動作させることができません。
この警告を取り除くために、現在のコードを iOS 10 に変換する方法を知っている人はいますか?
ありがとうございました!