|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而java是公开了。常常碰着同时必要对某个数据举行操纵,大概对某个文件举行读写操纵,关于这些操纵我们之前常常不克不及很好的举行处置,自从C#言语中引进了lock这个关头字,以上成绩就对照简单予以办理了,上面就是一段复杂的代码。
publicclassAccessControl()
{
privatestaticobjectprivateObjectLock=newobject();
publicstaticAccessResult()
{
lock(privateObjectLock)
{
//数据操纵语句www.elvin.com
}
}
}
C#多线程中lock的用法
在做邮箱吸收网关的时分碰到了以下的需求,请求为每个邮箱开启一个吸收线程,从POP3服务器上收取,然后将邮件寄存到一致的FTP服务器上,请求邮件按收接顺充从1入手下手顺充编号。
我完成的办法为,为每一个邮箱new出实例,然后分离赋给POP3邮箱地点,用户名,暗码等参数。这里触及到一个编号同步的成绩,由于每一个吸收邮件的线程都是本人实行,以是获得编号而且递增这个举措是互斥的。
以一个静态变量暗示编号以下:
lassEmailInfo
{
publicstaticintCurrentNumber;
}
那在以后线程获得这个步骤为:
_CurrentNumber=++EmailInfo.CurrentNumber;
固然此为一句,但在盘算机运转时却分为多步,以下:
EmialInfo.CurrentNumber加1--EmailInfo.CurrentNumber前往值给_CurrentNumber,大概线程1实行了EmailInfo.CurrentNumber加1的操纵,但还没有获得前往值,此时线程2又实行了EmailInfo.CurrentNumber加1的操纵,然后又线程1,线程2获得了前往值就是一样的,如许就得到了按按次递增的感化。
此时查找了网上有关线程同步的办法,实在用lock语句锁住递增的那一段便可。而先容的相干用法为:
lock(this)
{
_CurrentNumber=++EmailInfo.CurrentNumber;
}
本觉得如许就能够乐成,谁晓得仍是有效,重复查找才发明没弄分明lock的用法。由于网上所讲的材料,举的例子对照复杂,是间接new出一个对像,然后为对像的一个函数创立了多个线程运转,以是它的同步只需lock住this即它本人就好了。由于此时只要一个实例在运,而我是new出了多个对像,lock住每一个本人的实例以是固然有效。
以是天然想了一个办理办法,就lock住不异的一个实例就好了。由于我每一个邮件吸收线程的参数都是分歧的,以是仍是new出几个实像,但lock的办法改成以下:
先为EmailInfo加一个静态变量
classEmailInfo
{
publicstaticobjectsyncRoot=newobject();
publicstaticintCurrentNumber;
}
然后lock改成:
lock(EmailInfo.syncRoot)
{
_CurrentNumber=++EmailInfo.CurrentNumber;
}
便可完成想要的效果了。
你觉得数据库怎么样? |
|