Hello, 

I am writing a class to calculate average of prices. We use it to generate 
buy/sell signal for some financial instruments therefore latency is 
crucial.  Prices are sent via different threads therefore class needs to be 
thread-safe.

Am I correct in understanding that I have to use a lock to make the two 
operations (adding and incrementing) atomic? I have looked at 
AtomicLong/LongAdder/LongAccumulator but looks like they can only sum the 
numbers atomically.

*In other words, there is no way to do this in a lock-free manner? *

Thank you!



public final class Computer{

private ReentrantReadWriteLock rwLock;
private ReadLock readLock;
private WriteLock writeLock;

private BigDecimal sum;
private int count;

public AverageCalculatorThreadSafeImplementation2( ){
this.rwLock = new ReentrantReadWriteLock();
this.readLock = rwLock.readLock();
this.writeLock = rwLock.writeLock();
this.sum = new BigDecimal(0);
}

public final void add( double value ){
writeLock.lock();
try{
sum = sum.add( BigDecimal.valueOf(value) );
++count;
}finally{
writeLock.unlock();
}
}

public final double compute( ){
readLock.lock();
try{
return sum.divide(BigDecimal.valueOf(count)).doubleValue();
}finally{
readLock.unlock();
}
}

-- 
You received this message because you are subscribed to the Google Groups 
"mechanical-sympathy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web, visit 
https://groups.google.com/d/msgid/mechanical-sympathy/2d083587-2ee1-4f8f-a7ee-a99062a6ef5cn%40googlegroups.com.

Reply via email to