Make BoundedStatsDeque threadsafe.

Patch by brandonwilliams, reviewed by jbellis for CASSANDRA-4019
This commit is contained in:
Brandon Williams 2012-03-08 17:32:43 -06:00
parent c0a342bc85
commit 28a9a15e1c
1 changed files with 16 additions and 10 deletions

View File

@ -18,21 +18,20 @@
*/
package org.apache.cassandra.utils;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.LinkedBlockingDeque;
/**
* not threadsafe. caller is responsible for any locking necessary.
* bounded threadsafe deque
*/
public class BoundedStatsDeque extends AbstractStatsDeque
{
private final int size;
protected final ArrayDeque<Double> deque;
protected final LinkedBlockingDeque<Double> deque;
public BoundedStatsDeque(int size)
{
this.size = size;
deque = new ArrayDeque<Double>(size);
deque = new LinkedBlockingDeque<Double>(size);
}
public Iterator<Double> iterator()
@ -50,12 +49,19 @@ public class BoundedStatsDeque extends AbstractStatsDeque
deque.clear();
}
public void add(double o)
public void add(double i)
{
if (size == deque.size())
if (!deque.offer(i))
{
deque.remove();
try
{
deque.remove();
}
catch (NoSuchElementException e)
{
// oops, clear() beat us to it
}
deque.offer(i);
}
deque.add(o);
}
}