我已經寫了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 += 10;
同步只有一行代碼nasdaqIndexValue += diff;
例如,而另一個線程執行nasdaqIndexValue += 3;
我需要確保tottally正是13
加入。在這種情況下,我需要同步嗎?如果是這樣,使用lock-free
代碼怎麼辦?
UPD oooops我剛剛意識到,使用這樣的代碼,我會每次引入小的「delta」到nasdaqIndex,如果我使用雙打的話。因此,我要麼使用小數,要麼有時需要「完全重新計算」納斯達克指數,否則在一段時間後它不會等於股票的總和。
整數運算是原子,但我不知道多遠是去... – Ryan 2012-07-05 13:48:28
爲什麼它必須是無鎖? – 2012-07-05 13:49:31
@CharlieKilian因爲它會更快 – javapowered 2012-07-05 13:49:50