我写了简单的NasdaqIndex
计算示例。为简单起见,我将其声明为int
,这只是10
股票价格的总和。
class NasdaqIndex {
private int[] stockValue = new int[10]; // for simplicity let's assume they are already initialized
// just sum from 1 to 10 of stockValue
private int nasdaqIndexValue; // for simplicity let's assume that already initialized
public void StockValueUpdated(int stockValueIndex, int newValue) {
int diff = newValue - stockValue[stockValueIndex];
stockValue[stockValueIndex] = newValue;
nasdaqIndexValue += diff; // THIS NEED TO BE SYNCHRONIZED!
}
}
但在现实生活中,StockValueUpdated 可能(并且将会)从不同的线程对不同的 stockValueIndex 并行调用(对于相同的 stockValueIndex,它不会被称为并行)。
所以我只需要同步一行代码nasdaqIndexValue += diff;
例如,如果一个线程执行nasdaqIndexValue += 10;
而另一个线程执行,nasdaqIndexValue += 3;
我需要确保完全准确地13
添加。在这种情况下我是否需要同步?如果是这样,如何使用lock-free
代码做到这一点?
UPD oooops 我刚刚意识到,如果我使用双打,每次使用这样的代码都会向 nasdaqIndex 引入小的“delta”。所以我要么使用小数,要么有时必须“完全重新计算” nasdaqIndex,否则一段时间后它不会等于股票的总和。