您好我正在使用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;
}
我看不出反正圆不具有同步代码块?
感谢
这里你的实际问题是什么?你问是否有办法做到这一点没有任何锁定机制? –
是的 - 我的问题是在没有同步代码块的情况下完成的,并且仍然保持线程安全?谢谢 – Pat
任何问题的答案是“我是否需要同步x ...?”与“我有一个正在经历状态转换的可变对象需要多于一个离散步骤?”的答案相同。否则,线程可能会导致竞争条件和/或查看该对象处于无效,过渡和/或不一致状态的位置。异常存在于可变对象提供自己的内部同步的地方。你的状态转换似乎需要多个步骤,所以...... – scottb