在不改變方法簽名(method signature)的情況下, 請描述這段代碼的問題以及如何解決?

補充問題: 如果有多線程交互兩個public方法, 會不安全么?

class Volatile Test
{
private:
volatile int value;

public:

/// @brief Increments value by 1
void increment(void)
{
value++;
}
/// @brief Return value squared
int square(void)
{
return value * value;
}
}


題主給的代碼是C++的啊,而問題標籤里都是Java、JVM(而且class聲明的末尾還沒分號,讓我仔細看了半天是不是C#)。

這個不說「不改變方法簽名」,這玩兒就沒辦法當作Java來編譯。

更新:喂!居然有人擅自把題主原本打的Java、JVM標籤都去掉了。居心叵測啊。題主只是po了C++的代碼,但想來本意還是問Java的問題的…

如果換成正確的Java語法的話,那麼那個value改成用AtomicInteger是最佳。


我覺得題主的擔心應該是value++會不會衝突,value*value執行了一半別人插了進來結果兩個value讀出來的結果不一樣怎麼辦等問題。這其實很簡單。

@RednaxelaFX 巨巨說64位太短,沒關係Windows API支持128位(逃

https://msdn.microsoft.com/en-us/library/windows/desktop/ms683614(v=vs.85).aspx

InterlockedCompareExchange function

class VolatileTest
{
private:
volatile int64_t value = 0;

public:

/// @brief Increments value by 1
void increment(void)
{
InterlockedIncrement(value);
}
/// @brief Return value squared
int square(void)
{
// 因為value不可能是-1,所以比較一定會失敗。
int64_t fuck = InterlockedCompareExchange(value, -1, -1);
return static_cast&(fuck * fuck);
}
};


在MSDN搜atomic operation


推薦閱讀:

測試線程同步中出現的阻塞問題?
多線程執行順序控制?
求詳解該InterlockedIncrement的實現?
word2vec多線程優化時不加鎖的做法合理么?
ASIO + HTTP 如何打造高性能伺服器?

TAG:CC | 多線程 | 線程安全 |