問題タブ [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 投票する
4 に答える
1915 参照

java - 複数のフィールド: volatile または AtomicReference?

状態がいくつかのフィールドで構成される共有オブジェクトへのスレッド間のアクセスを同期する必要があります。言う:

私はおそらく多くのスレッドがこのオブジェクトを読んでいます。

特定の時点で書き込みを行うスレッドは 1 つだけです。

今私の質問は、読み取りスレッドが一貫性​​のない状態で共有オブジェクトを見つけないようにする方法です。

スレッド間の一貫性がvolatile解決策であるという多くの回答を読みましたが、それが複数のフィールドでどのように機能するかはわかりません。例えば、それで十分ですか?

別の解決策は、共有オブジェクトを不変にし、AtomicReference を使用することです。

そして、ライターは参照を交換するだけです:

そのアプローチは正しいですか?ありがとう!

更新私の設定では、共有オブジェクトはから取得されるConcurrentHashMap<Id,Shared>ため、コメントは、不変のアプローチを使用するか、共有の更新をすべて一緒に同期することであることに同意します。ただし、完全を期すために、上記の を使用した解決策ConcurrentHashMap<Id,AtomicReference<Shared>>が実行可能か、間違っているか、または単に不必要であるかを知っておくとよいでしょう。誰でも説明できますか?ありがとう!

0 投票する
0 に答える
186 参照

java - 変更されない原子参照

ユーザーが数値の式を入力しても、アトミックリファレンスが変更されません。Verify ボタン イベント ハンドラ内の行に関係があると思いますが、card1.CardValue() == (int)expInput.get(0)これを修正する方法がわかりません。配置しようとしdeck.get(0).CardValue()ましたが、その方法は機能しません。これを機能させるために、デッキを別の場所に配置できますか? これが私のコードです:

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

java - Hazelcast - AtomicReference.alterAndGet が HazelcastSerializationException をスローしている

同じマシンで 3 つの Hazelcast ノードを実行しています。各ノードは AtomicReference を変更しようとします。1 番目と 2 番目のノードは問題なく実行されており、3 番目のノードは HazelcastSerializationException をスローしています。

Hazelcast バージョン: Hazelcast 3.4.2 (20150326 - f6349a4)

何が起こっているか知っている人はいますか?

私のコード:

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

java - マルチスレッドアプリケーションで連続して失敗した後、ホスト名をブロックリストに追加する方法は?

以下に示すように、複数のスレッドによって呼び出されるコードで Callable を使用しています。今のところ、何かRestClientExceptionがスローされるたびhostnameに、blockList に追加しています。

以下は私がDataMappingクラスで持っているものです:

問題文:-

メソッドでわかるように、スローされるとすぐcallにブロックしていますが、これは正しくない可能性があります。特定のものが5 回連続してスローされたかどうかを確認する必要があります。次に、この行を呼び出してこれを blockList に追加するだけです。それ以外の場合は、blockList に追加しないでください。hostnameRestClientExceptionhostnameRestClientExceptionhostnameDataMapping.blockHost(hostname);

これを行うための最も効率的で最良の方法は何ですか? 最大で、合計で 70 ~ 100 台の固有のマシンを用意します。

hostnameこの場合、call メソッドは複数のスレッドから呼び出されるため、それぞれが をスローした場合に備えて、それぞれのカウントを適切に維持する必要がありますRestClientException

編集:

DataMappingクラスにも以下のメソッドがあります。

ホスト名が実際にブロックされているかどうかに関係なく、サービスが実際のデータを提供するため、セット全体を置き換える 2 分ごとに実行されるバックグラウンド スレッドがあります。atomic referenceそして、セット全体を交換するときは、 for が必要だと思います。

2分後にどのマシンがブロックされているかを知る必要があるため、コードにブロック機能をローカルに追加しています。