0

我写了简单的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,否则一段时间后它不会等于股票的总和。

4

2 回答 2

1

使用Interlockedtype 使该操作成为原子操作:

Interlocked.Add(ref nasdaqIndexValue, diff);
于 2012-07-05T13:53:10.873 回答
1

使用volatile关键字。

volatile修饰符通常用于被多个线程访问而不使用lock语句序列化访问的字段。

private volatile int nasdaqIndexValue; // for simplicity let's assume that already initialized
于 2012-07-05T13:56:36.707 回答