2013-08-25 28 views
2

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

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

我看不出反正圆不具有同步代码块?

感谢

+0

这里你的实际问题是什么?你问是否有办法做到这一点没有任何锁定机制? –

+0

是的 - 我的问题是在没有同步代码块的情况下完成的,并且仍然保持线程安全?谢谢 – Pat

+0

任何问题的答案是“我是否需要同步x ...?”与“我有一个正在经历状态转换的可变对象需要多于一个离散步骤?”的答案相同。否则,线程可能会导致竞争条件和/或查看该对象处于无效,过渡和/或不一致状态的位置。异常存在于可变对象提供自己的内部同步的地方。你的状态转换似乎需要多个步骤,所以...... – scottb

回答

4

我不能想想办法,除非你是越来越稍有不当值确定。

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

从JDK6开始,锁定采集速度非常快。如果我是你,我只是使用锁。

+1

这是一个有趣的实现,它只使用数组上的同步,比调用队列简单得多。 –

+0

很酷,感谢您的链接。 – Pat