位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

lock关键字的使用

提问人:刘冬梅发布时间:2020-10-13

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)

{

//如果balance小于0则抛出异常

throw new Exception("Negative Balance");

}

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

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

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

lock (this)

{

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);

balance = balance − amount;

return amount;

else 

{

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(); } }

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部