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

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


在添加方法中,我有:

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


我仍然看不到没有同步代码块吗?

谢谢

最佳答案

我无法想到一种方法,除非您可以接受稍微错误的值。

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

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

07-28 13:15