C# lock()的使用

本文介绍了一个使用C#实现的账户类,该类通过内部的锁机制保证了在线程并发执行时账户余额的安全更新。文章展示了如何利用lock语句防止多个线程同时访问和修改同一变量,从而避免了竞态条件导致的数据不一致问题。

using System;

using System.Threading;

internal class Account

{

int balance;

Random r = new Random();

internal Account(int initial)

{

balance = initial;

}

internal int Withdraw(int amount)

{

if (balance < 0)

{

throw new Exception("Negative Balance");

}

//下面的代码保证在当前线程修改balance的值完成之前

//不会有其他线程也执行这段代码来修改balance的值

//因此,balance的值是不可能小于0

lock (this)

{

Console.WriteLine();

Console.WriteLine("Current Thread:" + Thread.CurrentThread.Name);

//如果没有lock关键字的保护,那么可能在执行完if的条件判断之后

//另外一个线程却执行了balance=balance-amount修改了balance的值

//而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了

//但是,这个线程却继续执行balance=balance-amount,所以导致balance可能小于0

if (balance >= amount)

{

Thread.Sleep(5);

Console.WriteLine("Current Balance:{0}", balance);

Console.WriteLine("Current Amount:{0}",amount);

Console.WriteLine("Approved.../n");

balance = balance - amount;

return amount;

}

else

{

Console.WriteLine("Current Balance:{0}", balance);

Console.WriteLine("Current Amount:{0}", amount);

Console.WriteLine("Rejected.../n");

return 0; // transaction rejected

}

}

}

internal void DoTransactions()

{

for (int i = 0; i < 100; i++)

Withdraw(r.Next(-50, 100));

}

}

internal class Test

{

static internal Thread[] threads = new Thread[10];

public static void Main()

{

Account acc = new Account(0);

for (int i = 0; i < 10; i++)

{

Thread t = new Thread(new ThreadStart(acc.DoTransactions));

threads[i] = t;

}

for (int i = 0; i < 10; i++)

threads[i].Name = i.ToString();

for (int i = 0; i < 10; i++)

threads[i].Start();

Console.ReadLine();

}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值