問題タブ [atomic-long]
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 - AtomicLong 操作
次の操作を実行する必要があります。
でも使いたいAtomicLong
これは私が試みていることですが、それが正しいかどうかはわかりません:
これが正しいかどうかはどうすればわかりますか?
java - 演算子+=は、引数タイプint、AtomicLongに対して未定義です。
私は以下のような地図を持っています-
このマップには、多くのキーと値のペアが含まれています。値としてを置くAtomicLong
ことが必要だったので、それが私がそのマップにそのように置いた理由です。
したがってConcurrentHashMap
、上記のことを繰り返し実行しようとすると、常にこの行でエラーが発生します-
なので-The operator += is undefined for the argument type(s) int, AtomicLong
この問題を解決するにはどうすればよいですか?戻ってデータ構造をandInteger
ではなくallに変更することはできません。Long
AtomicLong
だから私はそれが動作し始めるように以下のコードで変更を加える方法を見つける必要があります。整数にキャストすることを考えていました。しかし、それも機能していませんでした。
以下は私のコードです
java - AtomicLong の incrementAndGet メソッドは内部でどのように機能しますか?
クライアント側コードの一部のパフォーマンスを測定するために、マルチスレッド コードでincrementAndGet
メソッドを使用しています。AtomicLong
上記のコードでは、時間を測定しようとしています-
client.getAttributes(columnsList);
とっている。
私の知る限り、incrementAndGet
メソッドは現在の値をアトミックに 1 ずつ増やします。これは、各スレッドが他のスレッドが値をインクリメントするのを待つ可能性があることを意味します。私は正しいですか?ブロックされるということでしょうか?
また、これはメソッドのパフォーマンスを測定する方法にも影響しますか? その測定にも余分な時間が追加されるということですか?
私がこれを尋ねている理由は、クライアント側コードとサーバー側コードのほとんどをベンチマークしようとしているからです。各メソッドにかかる時間を測定する必要がある場合は、次のように単純に実行しています-
測定したいコードが何であれ、通常はそのメソッドのすぐ上に以下の行を置きます
long start = System.nanoTime();
そして、これらの2行は同じ方法の後にありますが、ConcurrentHashMap
メソッドを使用しincrementAndGet
ていて、パフォーマンス測定に余分な時間を追加している場合、正確な結果が得られない可能性がありますか?
アップデート:-
これは以下の方法で、 で行ったときに取得しF3
ましincrementAndGet
たeclipse
。
ここに同期ブロックがあります。つまり、各スレッドはここで他のスレッドを待機します。そして、それはブロッキングコールです。
ああ。JVM を確認したところ、IBM JVM
と比較して実行されていSUN JVM
ます。私はこの特定のことを変えることができない会社で働いているので.
このロックベースのソリューションを回避して、メソッドのパフォーマンス/ベンチマークを測定する方法はありますか? 私は IBM JVM を実行していることに留意してください。
助けてくれてありがとう。
java - LongAdder[] + System.arraycopy() =?
簡単なシナリオは、LongAdders の配列があり、複数のスレッドがこの配列にアクセスして、特定のインデックスで変数をインクリメントすることです。
追加のロック機構なしで arraycopy を実行しても安全ですか?
私がこの問題を調査した限り、LongAdder のすべての重要なフィールドは揮発性であり、説明により、increment() はアトミックである必要があるため、問題ありません (つまり、部分的な状態を保持しないことを願っています)。今後の運用に問題あり)。
誰でもこれを確認できますか?
PS 最新のスナップショット (コピー中の増分) を取得できない可能性があることは承知していますが、問題ありません。
java - 値を設定して取得するだけの場合、AtomicLong を使用する利点はありますか?
長いインスタンス変数が必要です。
この変数は、イベント時間 (ミリ秒単位の時間) を保持します。
この long に値を設定して値を取得するだけの場合、
long ではなく AtomicLong (およびその get() と set() のみ) を使用する利点はありますか?
apache-spark - Spark Streaming: 全期間の平均
私は、温度値を受け取り、すべての時間の平均温度を計算する Spark Streaming アプリケーションを作成しました。そのために、JavaPairDStream.updateStateByKey
トランザクションを使用してデバイスごとに計算しました(ペアのキーで区切られています)。状態の追跡には、すべての温度値を double として保持し、メソッドStatCounter
を呼び出して各ストリームの平均を再計算するクラスを使用します。StatCounter.mean
ここに私のプログラム:
コード全体を編集: StatCounter を使用するようになりました
これはうまくいくようです。しかし今、質問に:
ここですべての時間の平均を計算する方法も示すオンラインの例を見つけました: https://databricks.gitbooks.io/databricks-spark-reference-applications/content/logs_analyzer/chapter1/total.html
AtmoicLongs
「ステートフルな値」を格納するために etc を使用し、forEachRDD
メソッドでそれらを更新します。
私の質問は次のとおりです。Spark ストリーミングですべての時間をステートフルに計算するためのより良いソリューションは何ですか? いずれかの方法を使用することの利点/欠点はありますか? ありがとうございました!
multithreading - LongAdder Striped64 wasUncontended 実装の詳細
これは、LongAdder がどのように機能するかという問題ではなく、私には理解できない興味深い実装の詳細に関する問題です。
Striped64 のコードは次のとおりです (いくつかの部分を切り取り、質問に関連する部分を残しました)。
を除いて、コードからの多くのことは私には明らかです。
次のCASが失敗するというこの確実性はどこにありますか? このチェックは単一のケースでのみ意味があるため、これは少なくとも私にとっては本当に混乱します。スレッドがlongAccumulateメソッドに n 回目 (n > 1) に入り、ビジー スピンが最初のサイクルにある場合です。
このコードは次のように言っているようです: あなた (一部のスレッド) が以前にここにいて、特定のセルスロットで競合が発生した場合は、値を既存のものに CAS しようとせず、代わりにプローブを再ハッシュしてください。
正直なところ、誰かにとって意味のあることを願っています。
java - AtomicLong の getAndAdd メソッドはスレッドを待機させますか?
マルチスレッド、すべてのスレッド共有、および単一の AtomicLong 変数でのプロセスを実行するプログラムがあります。それぞれが最初にメソッドを呼び出しgetAndAdd()
て値を取得し、さらに処理します。
すべてのスレッドが同時に実行されている場合、上記のメソッドを呼び出すと、あるスレッドが別のスレッドが値の取得を完了するのを待つことになりますか?