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一个字符串。

© 版权声明
好牛新坐标
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章