志在指尖
用双手敲打未来

c#多线程Lock()的使用说明

每个线程都有自己的资源,但是代码区是同享的,即每个线程都能够履行相同的函数。这或许带来的问题就是几个线程一起履行一个函数,导致数据的混乱,产生不可意料的结果,因而我们有必要防止这种情况的产生。
其间,lock是一种比较好用的简略的线程同步方式,它是通过为给定目标获取互斥锁来完成同步的。它能够确保当一个线程在关键代码段的时分,另一个线程不会进来,它只能等候,比及那个线程目标被释放,也就是说线程出了临界区。
用法:
[C#]纯文本检查
publicvoidFunction()
{
objectlockThis=newobject();
lock(lockThis)
{
//Accessthread-sensitiveresources.
}
}
下面是一个比较典型的运用C#lock关键字的比方,其间在注释里说明了C#lock关键字的用法和用途。c#多线程Lock()的使用说明
[C#]纯文本检查
usingSystem;
usingSystem.Threading;
namespaceThreadSimple
{
internalclassAccount
{
intbalance;//余额
Randomr=newRandom();
internalAccount(intinitial)
{
balance=initial;
}
internalintWithdraw(intamount)//取回、取款
{
if(balance<0)
{
//假如balance小于0则抛出异常
thrownewException(“NegativeBalance”);//负的余额
}
//下面的代码确保在当前线程修改balance的值完成之前
//不会有其他线程也履行这段代码来修改balance的值
//因而,balance的值是不或许小于0的
lock(this)
{
Console.WriteLine(“CurrentThread:”+Thread.CurrentThread.Name);
//假如没有lock关键字的维护,那么或许在履行完if的条件判别(成立)之后
//别的一个线程却履行了balance=balance-amount修改了balance的值
//而这个修改对这个线程是不可见的,所以或许导致这时if的条件已经不成立了
//但是,这个线程却持续履行balance=balance-amount,所以导致balance或许小于0
if(balance>=amount)
{
Thread.Sleep(5);
balance=balance-amount;
returnamount;
}else
{
return0;
//transactionrejected
}
}
}
internalvoidDoTransactions()//取款事务
{
for(inti=0;i<100;i++)
{
Withdraw(r.Next(-50,100));
}
}
}
internalclassTest
{
staticinternalThread[]threads=newThread[10];
publicstaticvoidMain()
{
Accountacc=newAccount(0);
for(inti=0;i<10;i++)
{
Threadt=newThread(newThreadStart(acc.DoTransactions));
threads[i]=t;
}
for(inti=0;i<10;i++)
{
threads[i].Name=i.ToString();
}
for(inti=0;i<10;i++)
{
threads[i].Start();
Console.ReadLine();
}
}
}
}
lock的参数有必要是基于引用类型的目标,不要是根本类型像bool,int什么的,这样根本不能同步,原因是lock的参数要求是目标,假如传入int,势必要产生装箱操作,这样每次lock的都将是一个新的不同的目标。最好防止运用public类型或不受程序控制的目标实例,由于这样很或许导致死锁。特别是不要运用字符串作为lock的参数,由于字符串被CLR“暂留”,就是说整个应用程序中给定的字符串都只要一个实例,因而更简单形成死锁现象。主张运用不被“暂留”的私有或受维护成员作为参数。其实某些类已经供给了专门用于被锁的成员,比方Array类型供给SyncRoot,许多其它调集类型也都供给了SyncRoot。
所以,运用lock应该留意以下几点:
1、假如一个类的实例是public的,最好不要lock(this)。由于运用你的类的人也许不知道你用了lock,假如他new了一个实例,而且对这个实例上锁,就很简单形成死锁。
2、假如MyType是public的,不要lock(typeof(MyType))。
3、永久也不要lock一个字符串。

未经允许不得转载:IT技术网站 » c#多线程Lock()的使用说明
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载