2

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

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

除非您可以接受稍微错误的值,否则我想不出办法。

另一方面,最注重性能的实现之一也使用了锁(度量库)。

自JDK6以来,锁获取变得非常快。如果我是你,我只会用锁。

于 2013-08-25T21:20:54.950 回答