在開始之前
class BankAccount
{
public int Balance
{
get;
set;
}
}
class App
{
static void Main(string[] args)
{
// create the bank account instance
BankAccount account = new BankAccount();
// create an array of tasks
Task[] tasks = new Task[
for (int i =
{
// create a new task
tasks[i] = new Task(() =>
{
// enter a loop for
for (int j =
{
// update the balance
account
}
});
// start the new task
tasks[i]
}
// wait for all of the tasks to complete
Task
// write out the counter value
Console
// wait for input before exiting
Console
Console
}
}
J結果確實和大家猜想的一樣
下面就是本篇和接下來的幾篇文章要講述的內容
如果大家對多線程編程比較熟悉
下面就來分析一下
當在把account對象的Balance進行自增的時候
讀取現在account對象的Balance屬性的值
計算
把新變量的值再次賦給account的Balance屬性
在理論上面
之前的代碼每次執行一次
在下面的圖中
所以
通過這個例子
數據競爭就好比一個生日party
在之前的圖示例講解中
注意
順序的執行解決了通過每次只有一個task訪問共享數據的方式解決了數據競爭的問題
數據不變的解決方案就是通過讓數據不能被修改的方式來解決共享數據競爭
在C#中
public const int AccountNumber=
被聲明為const的字段只能通過類型來訪問
readonly的字段可以在實例的構造函數中修改
如下代碼
using System;
class ImmutableBankAccount
{
public const int AccountNumber =
public readonly int Balance;
public ImmutableBankAccount(int InitialBalance)
{
Balance = InitialBalance;
}
public ImmutableBankAccount()
{ Balance =
}
}
class App
{
static void Main(string[] args)
{
// create a bank account with the default balance
ImmutableBankAccount bankAccount
Console
ImmutableBankAccount
// create a bank account with a starting balance
ImmutableBankAccount bankAccount
Console
ImmutableBankAccount
// wait for input before exiting
Console
Console
}
} 數據不變的解決方案不是很常用
From:http://tw.wingwit.com/Article/program/ASP/201311/21756.html