3.隔离:我们不共享数据,让每个task都有一份自己的数据拷贝。
4.同步:通过调整task的执行,有序的执行task。
注意:同步和以前多线程中的同步,或者数据库操作时的同步概念不一样
3. 顺序的执行的解决方案
顺序的执行解决了通过每次只有一个task访问共享数据的方式解决了数据竞争的问题,其实在本质上,这种解决方案又回到了之前的单线程编程模型。如果拿之前的party分蛋糕的例子,那么现在就是一次只能允许一个人去拿蛋糕。
数据不变解决方案
数据不变的解决方案就是通过让数据不能被修改的方式来解决共享数据竞争。如果拿之前的蛋糕为例子,那么此时的情况就是:现在蛋糕只能看,不能吃。
在C#中,可以同关键字 readonly 和 const来声明一个字段不能被修改:
public const int AccountNumber=123456;
被声明为const的字段只能通过类型来访问:如,上面的AccountNumber是在Blank类中声明的,那么访问的方式就是Blank. AccountNumber
readonly的字段可以在实例的构造函数中修改。
如下代码:
using System;
class ImmutableBankAccount
{
public const int AccountNumber = 123456;
public readonly int Balance;
public ImmutableBankAccount(int InitialBalance)
{
Balance = InitialBalance;
}
public ImmutableBankAccount()
{
Balance = 0;
}
}
class App
{
static void Main(string[] args)
{
// create a bank account with the default balance
ImmutableBankAccount bankAccount1 = new ImmutableBankAccount();
Console.WriteLine("Account Number: {0}, Account Balance: {1}",
ImmutableBankAccount.AccountNumber, bankAccount1.Balance);
// create a bank account with a starting balance
ImmutableBankAccount bankAccount2 = new ImmutableBankAccount(200);
Console.WriteLine("Account Number: {0}, Account Balance: {1}",
ImmutableBankAccount.AccountNumber, bankAccount2.Balance);
// wait for input before exiting
Console.WriteLine("Press enter to finish");
Console.ReadLine();