使用队列的Java中的并发移动平均窗口?

时间:2013-08-25 20:58:14

标签: java multithreading

您好我正在使用ConcurrentLinkedQueue在Java中创建移动平均窗口(MAW)数据结构。 MAW可以同时被多个线程调用,所以我需要确保我的代码是线程安全的 - 我能看到的唯一方法是在添加中使用同步代码块(使用Queue作为锁)方法:

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;
}

我还没有看到没有同步代码块?

由于

1 个答案:

答案 0 :(得分:4)

除非你能得到稍微错误的值,否则我想不出办法。

另一方面,性能最敏感的实现之一也使用锁(the metrics library)。

自JDK6以来,锁定获取速度非常快。如果我是你,我只会使用锁。