問題タブ [atomicinteger]
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 - ロックを正しく使用できない
ロックと基本的なマルチスレッドの概念についてはかなり理解していたと思いますが、ここで何かをめちゃくちゃにしています。
プログラムは、テキスト ファイルのファイル名と使用するスレッドの数をユーザーから受け取り、そのファイル内の "http" リンクの数を数えてから、その数をユーザーに返すだけです。
ただし、私の人生では、スレッドを適切にカウントすることはできません。「count」変数をアトミック整数にして、「incrementAndGet()」関数を使用してみました。コード内のロックがあるべきだと思った場所にロックを配置してみました。また、必要な関数を同期するように指定してみました。 、すべて無駄に。
私はロック、同時実行性などについてできる限りのことを読んできましたが、どうやら非常に間違ったことをしているようです。コードのどこに/なぜロックを配置する必要があるのか (または、アトミック整数を適切に使用する方法がより効果的である場合)、誰かが私に説明できますか?
私はもともと "count" 変数が使用されたとき (ループの外側で実際に何かを実行したとき) にロックしていましたが、プログラムを実行するとあらゆる種類の数値を受け取ります。
私のコードは次のようになります。
適切な場所でロックを使用する必要があるよりも大きな問題がここで発生している場合は、私に知らせてください.適切にロックされていますが、それらがどのように正しく機能するかを理解していないか、間違った場所に置いているだけです。
java - 並行スレッドセーフ AtomicInteger
java.util.concurrent パッケージの API ドキュメントを読みましたが、明らかに誤解しているものがあります。概要は言う
単一変数でのロックフリー スレッドセーフ プログラミングをサポートするクラスの小さなツールキット。
ただし、小さなテスト アプリケーションでは、少なくともスレッド間で共有されている場合、AtomicInteger クラスがスレッド セーフを提供しないことが示されています ( getAndSet / increment メソッド自体が少なくともアトミックであることは認めます) 。
テスト:
このクラスを実行すると、常に 950 から 1000 の範囲の結果が得られますが、常に正確に 1000 が表示されると予想されます。
2 つのスレッドがこの共有 AtomicInteger 変数にアクセスすると、一貫した結果が得られない理由を説明できますか? スレッドセーフ保証を誤解していませんか?
java - コア Java 、マルチスレッド環境の共有カウンター
Java カウンターの問題が発生しました。2 つのスレッドが共通のカウンターを共有し、順番にインクリメントします。誰かが同期、ロック、および AtomicIntegers を使用したコード例を示してください。異なるアプローチを使用することを意味します。この問題について、適切に機能するコードの比較が得られません。ありがとう。
java - JVM は AtomicInteger 呼び出しの前後で命令を並べ替えることができますか?
(AtomicInteger a).addAndGet(-1)
前のコードは常にこの呼び出しの前に実行される、つまり JVM は呼び出しの前後で命令の順序を変更しないと仮定しても安全addAndGet
ですか?
AtomicInteger
はいの場合、同じインスタンスの状態をチェックしている他のスレッド(例: ) は、呼び出しif (a.compareAndSet(0, -1))
前に最初のスレッドが変更したすべてのものを確認すると想定しても安全ですか?addAndGet
java - Java AtomicInteger の 2 進数の長さを指定します
Java AtomicInteger は、 の通常の 4 バイト長を使用していますint
。
次のコードを実行すると
私たちは得るだろう
原子整数のサイズを設定して、32 ビットではなく 20 ビットの長さにし、原子性を維持する方法はありますか?
たとえば、新しい結果は次のようになります。
-2^19
と_ 2^19-1
java - AtomicInteger のメソッドの実際の例
AtomicInteger クラスのいくつかのメソッドの要点を理解するのを手伝ってくれませんか: updateAndGet
, accumulateAndGet
.
なぜ最初のものIntUnaryOperator
はパラメータとして受け取るのですか? このインターフェースの関数メソッドに適用できる可能性のあるロジックは何ですか? int
私の考えでは、単純な価値だけを受け取りやすいでしょう。IntBinaryOperator
(インターフェースと同じ)。
前もって感謝します。