温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#多线程中lock怎么用

发布时间:2021-12-01 16:30:39 来源:亿速云 阅读:179 作者:小新 栏目:编程语言

这篇文章主要介绍了C#多线程中lock怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

下面就是一段简单的代码。

public class AccessControl()  {  private static object privateObjectLock = new object();  public static AccessResult()     {  lock(privateObjectLock)  {  //数据操作语句  }  }  }

学习C#多线程:邮箱问题

在做邮箱接收网关的时候遇到了以下的需求,要求为每一个邮箱开启一个接收线程,从POP3服务器上收取,然后将邮件存放到统一的FTP服务器上,要求邮件按收接顺充从1开始顺充编号。

我实现的方法为,为每个邮箱new出实例,然后分别赋给POP3邮箱地址,用户名,密码等参数。这里涉及到一个编号同步的问题,因为每个接收邮件的线程都是自己执行,所以取得编号并且递增这个动作是互斥的。

以一个静态变量表示编号如下

class EmailInfo  {  public static int CurrentNumber;  }

那在当前线程取得这个步骤为

_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加一个静态变量

class EmailInfo  {  public static object syncRoot = new object();  public static int CurrentNumber;  }  然后lock改为  lock(EmailInfo.syncRoot)  {  _CurrentNumber=++EmailInfo.CurrentNumber;  }

即可实现想要的效果了。

感谢你能够认真阅读完这篇文章,希望小编分享的“C#多线程中lock怎么用”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI