2

こんにちは、ConcurrentLinkedQueue を使用して Java で移動平均ウィンドウ (MAW) データ構造を作成しています。MAW は複数のスレッドから同時に呼び出される可能性があるため、自分のコードがスレッド セーフであることを確認する必要があります。方法:

final Queue<Double> myQ = new ConcurrentLinkedQueue<Double>();
volatile double total;
volatile int count;

add メソッドには次のものがあります。

synchronized (myQ)
{
   if (myQ.offer(value))
   {
      total += value;
      count++;
   }
   if (size > window)
   {
      total -= myQ.poll();
      count--;
   }
   movingAvg = total / count;
}

とにかく、同期されたコードブロックがないことはわかりませんか?

ありがとう

4

1 に答える 1

4

少し間違った値を取得しても問題ない場合を除き、方法は考えられません。

一方、最もパフォーマンスを意識した実装の 1 つは、ロックも使用します (メトリクス ライブラリ)。

JDK6以降、ロックの取得が非常に高速になりました。私があなただったら、ロックを使います。

于 2013-08-25T21:20:54.950 に答える