`
pavel
  • 浏览: 915794 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用C# lock同时访问共享数据

阅读更多
最近在看些c#的代码,发现很多是以前没有接触到了,只能上网查,把比较好的整理下来。
经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于这些操作我们以前往往不能很好的进行处理,自从C#语言中引入了lock这个关键字,以上问题就比较容易予以解决了,下面就是一段简单的代码。

<!---->public class AccessControl()
{
    
private static object privateObjectLock = new object();

    
public static AccessResult()
    {
    
lock(privateObjectLock)
    {
         
//数据操作语句
    }
    }
}

 

 

==============================================================================

C#多线程中lock的用法

在做邮箱接收网关的时候遇到了以下的需求,要求为每一个邮箱开启一个接收线程,从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同时访问共享数据

    本篇文章是对使用C# lock同时访问共享数据进行了详细的分析介绍,需要的朋友参考下

    C#中volatile与lock用法

    volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...

    C#线程锁介绍源码

    只有可以被多线程访问的共享资源才需要考虑锁定,比如静态变量,再比如某些缓存中的值,而属于线程内部的变量不需要锁定。 2)多使用lock,少用Mutex 如果你一定要使用锁定,请尽量不要使用内核模块的锁定机制,...

    浅析c# 线程同步

    访问共享资源(数据)是有时可能会暂停系统的关键任务。所以可以通过线程同步来处理它。 主要场景如:存款,取款等交易业务处理。 线程同步的优点 一致性维护 无线程干扰 C#锁定 使用 C# lock关键字同步执行程序。...

    C#开发经验技巧宝典

    0700 如何在C#应用程序中使用INI文件 430 0701 如何操作帮助文件 431 0702 如何操作Word文件 432 0703 如何操作Excel文件 433 0704 如何将文本文件转换成网页文件 434 0705 如何产生随机文件夹名或文件名...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    C#编程经验技巧宝典

    102 &lt;br&gt;0162 如何实现C#中用键完成TAB的功能 102 &lt;br&gt;0163 如何限制文本框密码输入长度 102 &lt;br&gt;0164 数据输入为空提示 103 &lt;br&gt;0165 如何设置文本框光标到末尾 103 &lt;br&gt;0166 输入法调整...

    CLR.via.C#.(中文第3版)(自制详细书签)

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

Global site tag (gtag.js) - Google Analytics