8
我一直在讀這本書從約瑟夫阿爾巴哈利約線程:
http://www.albahari.com/threading/爲什麼這個任務不是線程安全的?
在第2部分中,我發現這個例子:
http://www.albahari.com/threading/part2.aspx#_When_to_Lock
這裏是前述例子:
class ThreadUnsafe
{
static int _x;
static void Increment() { _x++; }
static void Assign() { _x = 123; }
}
線程安全版本:
class ThreadSafe
{
static readonly object _locker = new object();
static int _x;
static void Increment() { lock (_locker) _x++; }
static void Assign() { lock (_locker) _x = 123; }
}
我不明白爲什麼指定方法不是線程安全的。 32位和64位架構上的整數賦值不應該是原子操作嗎?
請問您能解釋一下while循環嗎?如果線程1始終將_ 123分配給_x,線程2還能從中讀取什麼? – Ivan
添加了原始代碼,以澄清問題。 –
@伊萬:那該怎麼辦?它只是試圖循環,直到線程2「看到」123到'_x'的賦值。關鍵是它可能永遠不會「看到」這種變化。 –