問題タブ [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 に答える
1175 参照

java - AtomicReference

ドキュメントによると、AtomicReference.compareAndSet()メソッドについていくつか質問がありました。

現在の値==期待値の場合、原子的に値を指定された更新された値に設定します。

私が理解している限り、==オペレーターは2つのオブジェクトのアドレスを比較しています。もしそうなら、このような例ではどのように機能しますか

このコードスニペットでは、jvmはどのフィールドを?AccessStatisticsで比較するかをどのように認識しcompareAndSet()ますか?実際、Javaでオーバーライドがまったく許可されていない場合、この戦略全体がどのように機能するのか疑問に思っています==。コメントありがとうございます!

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

java - フィールドへの同時アクセスを制限する

そのため、私が書いているプログラムでは、双方向の幅優先検索を使用してグラフを検索しています。これを行うには、1 つのスレッドで 1 つの幅優先検索を実行し、別のスレッドで 1 つの幅優先検索を実行します。現在、検索は、他の検索の要素がヒットしたとき、またはゴールが見つかったときに、最適なソリューションを見つけたと言われています (実際には決して起こりませんが、何らかの理由でヒットした場合に備えて..)。

私が直面している問題は、すべての解を見つけ続ける必要があるため、この最適な解をフィールドに保存する必要があることですが、両方のスレッドが同時にヒットするため、フィールド値が台無しになっています (おもう)。

最後にそこに到達したスレッドへのアクセスをブロックする方法はありますか? AtomicReference とその compareAndSet メソッドを使用してみましたが、うまくいきませんでした。値はまだめちゃくちゃです....

ところで、私はJavaを使用しており、スレッドにはCallableオブジェクトを使用しています。

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

java - java - スレッド間でデータを共有する - アトミック参照または同期

私は 2 プレーヤーのビデオゲームを作成しています。対戦相手の位置はスレッドで更新されます。これは、継続的にリッスンしているソケットがあるためです。共有したいのは、位置と回転です。

これはビデオゲームであるため、メイン スレッドをブロックしたり (または可能な限り最小限の時間にしたり)、パフォーマンスに影響を与えたりしたくありません。したがって、この情報を共有するために私が見たことから、通常行うことは次のようになります

しかし、これは3つの値(または将来さらに多くの情報が書き込まれる)が書き込まれるまで、メインスレッド(ビデオゲームを描画するのと同じ)での読み取りをブロックします。このゲームは Android 用でもあるため、パフォーマンスが非常に重要であると言うことが重要です)。

しかし、参照自体が更新されているときにのみ停止するため、AtomicReference 内に sharedInfo を配置し、synchronized を削除すると、より効率的になると考えていました (書き込みが存在しないため、新しいオブジェクトを作成して、また、atomic* はハードウェア操作を使用し、同期よりも効率的であるとも述べています。

どう思いますか?

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

multithreading - スレッドセーフではないのに、boost::shared_ptr がアトミック参照カウントを気にするのはなぜですか?

これはちょっとした質問ですが、boost::shared_ptr はスレッドセーフではないのに、アトミックな参照カウントをわざわざ使う必要があるのでしょうか? デストラクタはスレッド間で安全に使用できないため、要点がわかりません。

たとえば、shared_ptr のコピーをスレッドに渡すと、少なくともスレッドが最後に終了するときは常に破棄されます。

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

java - ロックなしで、おそらくAtomicReferenceを使用して、スレッドセーフな方法でBigIntegerを安全にインクリメントすることは可能ですか?

私たちのコードの多くはレガシーですが、「ビッグデータ」バックエンドに移行しており、新しい API 呼び出しを普及させ、最新の Spring ライブラリの使用を奨励しようとしています。問題の 1 つはアプリケーション層 ID です。世代。理由はわかりませんが、より高い権威は連続した BigInteger を望んでいます。再生成して失敗した挿入を再試行してそれらをランダムにしましたが、拒否されました。

不平はさておき、私はスレッド間で BigInteger をインクリメントして取得し、それを安全でパフォーマンスの高い方法で行う必要がある立場にいます。以前に AtomicReference を使用したことはありませんが、このアプリケーションにはほぼ完璧に見えます。現在、同期されたコード ブロックがあり、パフォーマンスがかなり低下しています。

これは正しい方法ですか?構文例?

このモジュールの動作方法は、ストアド プロシージャを使用してデータベースにアクセスし、使用する値の範囲を取得することです。一度に何万件も発生するため、20 分に 1 回しか発生しません。これにより、さまざまなサーバーが互いに干渉するのを防ぎますが、BigInteger を任意の後続の値に設定しなければならないという問題も追加されます。もちろん、それもスレッドセーフである必要があります。

PS私はまだ、このすべてのスレッド処理を処理するよりも、ランダム生成のアイデアの方が優れていると思います。BigInteger は途方もなく大きな数であり、同じものを 2 回生成する確率はゼロに近くなければなりません。

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

gcc - GCCアトミックビルトインと揮発性

マルチスレッドプログラムでいくつかのグローバル構造を使用しています。メンバーの中には、複数のスレッドによって同時に変更されるものと、そうでないものがあります。

このメンバーを揮発性として定義しませんでしたが、読み取りと書き込みの両方の目的でこのメンバーを使用するときはいつでも、__sync_fetch_and_addなどのアトミックビルトインを使用します。

問題は、このメンバーを定義する必要がありますか、それとも構造体全体を揮発性にする必要がありますか?

このビルトイン(ロックプレフィックス)のため、コンパイラはレジスタではなくメモリにアクセスする必要があると思います。競合状態を引き起こさない他のメンバーについて心配する必要があります。

コンパイラ(gcc 4.6.2)のアセンブリ出力を確認しましたが、私の仮定は正しいようです。

これがテストコードです。

アセンブリ出力(-O2 -S -masm = intel)

したがって、コンパイラがメモリにアクセスされることはありません(eax = i、edx = sum)

これが2番目のテストコードです。

アセンブリ出力

コンパイラは、期待どおりに毎回合計のためにメモリにアクセスしました。

最終的なコード、私のやり方。

アセンブリ出力。

以前のように一時レジスタ(edx)でさえなく、コンパイラは毎回メモリにアクセスしました。

したがって、複数のスレッドによって変更されたメンバー、または一度に1つのスレッドのみによって変更されたメンバーをvolatileとは定義しません。私は安全ですか?

前もって感謝します。

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

java - AtomicReference との違いは何ですか対 AtomicInteger?

これら2つの違いがわかりません:

対。

AtomicReference をいつ使うべきか、誰かが一般的に言うことができますか? 誰かが私を助けてくれることを願っています。ありがとう。

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

java - 最終的な AtomicReference について説明してください

誰かが私にこれを説明できますか:

final はどのような意味で使用されますか?

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

java - volatile、syncronized、AtomicReference などの概念を正しく理解していますか?

これらの概念を正しく理解していることを確認したいと思います。説明/確認は私を大いに助けてくれますし、他の多くのプログラマーも確信しています。したがって、これらの概念についての私の理解は、私の調査から得られたものです。

  1. Volatile は、複数のスレッド間で変数を共有する場合に使用されます。a) (スレッド間で共有される) 変数を volatile と宣言しないことの違いは何ですか? b) 異なるスレッドからアクセスしている場合、常に volatile と宣言する必要がありますか? c) volatile 変数を同期することは理にかなっていますか?

  2. AtomicReference は、オブジェクトをラップし、いくつかのアトミック操作 (compareAndSet、lazySet、weakCompareAndSet) を提供するクラスです。これですべてです。同期も何もありません。a) AtomicReference volatile を宣言するのは理にかなっていますか? b) AtomicReference.get は同期もセットもされていないため、同期しますか?

  3. 同期は、複数のスレッド間で共有される変数への順次アクセスを意味する概念です。インスタンスごと、クラスごとに行うことができます。同期は、メソッド ヘッダーまたはコード ブロックに追加できます。ここにミステリーはありません:)

よろしく、アウレリアン

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

java - Java のロックフリーでサイズ制限のあるキュー

この投稿によると、Java でロックフリー キューの実装を拡張しようとしています。

私の実装では、アトミック変数/参照のみを使用することに制限されています。さらに、キューには最大サイズが必要です。したがって、キューがいっぱいの場合は putObject() をブロックし、キューが空の場合は getObject() をブロックする必要があります。

現時点では、ロックを使用せずにこれを解決する方法がわかりません。

たとえば、AtomicInteger を使用する場合、変更操作はアトミックになります。しかし、まだ putObject() と getObject() でチェックと変更の状況を処理しなければならないという問題がありますよね? そのため、現在のキュー サイズを確認した後、エンキュー スレッドが中断されるという状況が依然として存在します。

現時点での私の質問は、この問題が私の現在の制限で解決できるかどうかです。

あいさつ