C#多线程中lock的用法

开发 后端
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。本文主要介绍lock在c#中的用法,一起来看。

经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于这些操作我们以前往往不能很好的进行处理,自从C#语言中引入了lock这个关键字,以上问题就比较容易予以解决了,下面就是一段简单的代码。

  1. public class AccessControl()  
  2. {  
  3. private static object privateObjectLock = new object();  
  4. public static AccessResult()  
  5. {  
  6. lock(privateObjectLock)  
  7. {  
  8. //数据操作语句 www.elvin.com  
  9. }  
  10. }  

 

C#多线程中lock的用法

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

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

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

  1. lass EmailInfo  
  2. {  
  3. public static int CurrentNumber;  

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

  1. _CurrentNumber=++EmailInfo.CurrentNumber; 

虽然此为一句,但在计算机运行时却分为多步,如下:

EmialInfo.CurrentNumber加1--EmailInfo.CurrentNumber返回值给_CurrentNumber,也许线程1执行了EmailInfo.CurrentNumber加1 的操作,但还没有取得返回值,此时线程2又执行了EmailInfo.CurrentNumber加1的操作,然后又线程1,线程2取得了返回值就是一样的,这样就失去了按顺序递增的作用。

此时查找了网上有关线程同步的方法,其实用lock语句锁住递增的那一段即可。而介绍的相关用法为:

  1. lock(this)  
  2. {  
  3. _CurrentNumber=++EmailInfo.CurrentNumber;  

本以为这样就可以成功,谁知道还是无效,反复查找才发现没弄清楚lock的用法。因为网上所讲的资料,举的例子比较简单,是直接new 出一个对像,然后为对像的一个函数创建了多个线程运行,所以它的同步只要lock住this即它自己就行了。因为此时只有一个实例在运,而我是new 出了多个对像,lock住每个自己的实例所以当然无效。

所以自然想了一个解决方法,就lock住相同的一个实例就行了。因为我每个邮件接收线程的参数都是不同的,所以还是new出几个实像,但lock的方法改为如下:

先为EmailInfo加一个静态变量

  1. class EmailInfo  
  2. {  
  3. public static object syncRoot = new object();  
  4. public static int CurrentNumber;  

然后lock改为:

  1. lock(EmailInfo.syncRoot)  
  2. {  
  3. _CurrentNumber=++EmailInfo.CurrentNumber;  

即可实现想要的效果了。

原文链接: http://www.elivn.com

【编辑推荐】

  1. 浅谈C++调用C#的DLL程序方法
  2. 详解C#中不同类的类型
  3. C#选择正确的集合进行编码
  4. 教你写不可思议的C#代码
  5. C#图片处理的3种高级实用方法
责任编辑:于铁 来源: 博客园
相关推荐

2009-08-26 18:13:55

C#多线程lock

2009-08-21 11:31:59

异步和多线程的区别

2009-08-12 18:04:44

编写C#多线程

2009-09-04 15:09:48

C#多线程启动Squa

2009-08-28 16:43:57

C#多线程学习

2009-09-01 17:15:42

C#多线程应用

2009-08-17 16:56:51

C#多线程控制进度条

2009-07-17 10:37:05

C#多线程

2009-08-20 18:11:08

C#异步委托

2009-08-06 10:35:27

C# lock thi

2021-06-10 00:13:43

C#队列数据

2021-03-26 05:54:00

C#数据方法

2009-08-26 18:02:15

C#多线程

2024-04-03 08:25:11

DictionaryC#字典类型

2022-06-15 07:32:35

Lock线程Java

2011-07-06 10:47:52

C#using

2009-08-26 14:48:21

C#打印分页

2015-11-24 15:13:15

2021-09-09 07:16:00

C#多线程开发

2024-02-27 10:44:58

C#线程后端
点赞
收藏

51CTO技术栈公众号