最近在看些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#中实现线程同步的关键工具之一,它基于Monitor类,提供了对共享资源的独占访问。当一个线程进入`lock`块时,它会尝试获取锁,如果成功,则执行代码块内的语句;如果其他线程已经持有该锁,当前线程...
volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。 1、volatile的使用...
`lock`关键字是C#中用于实现互斥访问共享资源的一种同步原语。在多线程环境中,多个线程可能同时尝试修改同一份数据,如果不加以控制,可能会导致数据不一致或者竞争条件(race condition)。`lock`语句通过获取一个...
它提供了基本的同步机制,防止多个线程同时访问共享资源,从而避免数据不一致性和可能的错误。在设计多线程程序时,合理地使用`lock`可以帮助我们创建出高效且健壮的并发应用。然而,需要注意的是,过度使用`lock`...
在IT行业中,"LockFree"是一种并发编程技术,它的核心思想是避免在多线程环境下使用锁来同步对共享资源的访问。LockFree技术在C# .NET框架中也有广泛的应用,可以显著提高多线程环境下的程序性能,降低死锁和竞态...
通过使用lock(this)语句,可以保证在同一时刻只有一个线程可以访问某个资源,防止多个线程同时访问同一个资源而导致的数据不一致或其他问题。 lock(this)的使用格式为lock(objectA){codeB},其中objectA是要锁定的...
这些机制的主要目标是避免竞态条件,保证并发执行的线程能够正确地访问和修改共享数据。 首先,我们来看lock关键字。lock语句用于创建一个临界区,确保在同一时刻只有一个线程可以执行特定的代码块。然而,使用lock...
Monitor类是.NET Framework中用于同步线程访问共享资源的一种方式。Monitor依靠内置锁实现线程同步,当一个线程访问某个对象时,它会尝试获取该对象上的锁。如果锁已经被其他线程获取,该线程会被阻塞,直到锁被释放...
// 访问共享资源的代码 } ``` 这段代码会确保在同一时刻只有一个线程可以执行`lock`块内的代码,从而实现互斥访问。 四、Mutex与跨进程同步 Mutex允许不同进程间的资源同步,常用于控制全局资源的访问。创建一个...
在这个"多线程互斥实例 多线程获取同一变量"的示例中,我们将探讨如何在多个线程中安全地访问共享资源,避免数据不一致性和竞态条件。 首先,我们需要理解多线程中的一些核心概念: 1. **线程**:线程是操作系统...
C#中的`lock`关键字是一种同步机制,可以防止多个线程同时访问共享资源。 4. **同步锁**:在描述中提到的“同步锁”是解决并发问题的关键。C#中的锁机制,如`Monitor`类、`Mutex`类和`Semaphore`类,可用于控制对...
本主题将深入探讨如何在VS2013中使用C#实现线程安全的串口数据接收。 串口通信是计算机通过串行端口进行数据传输的一种方式,常用于设备间的短距离通信。在C#中,我们可以使用`System.IO.Ports.SerialPort`类来与...
它提供了一种互斥访问共享资源的方式,确保同一时间只有一个线程可以执行特定的代码块。例如: ```csharp lock (obj) { // 临界区代码 } ``` 这里的`obj`是用于同步的锁对象,通常为私有静态变量,确保唯一性。...
6. **进程间的通信协议**:由于多个进程可能同时访问共享内存,因此需要定义一套通信协议来指示何时可以读写,何时数据已经准备好,以及如何处理错误。 7. **异常处理**:处理可能出现的异常至关重要,例如当尝试...
3. **线程同步与互斥**:在多线程环境中,为防止多个线程同时访问共享资源导致数据不一致,需使用同步机制。C#提供了`Monitor`、`Mutex`、`Semaphore`、`lock`关键字等工具。本项目可能运用这些工具确保线程安全,...
在C#编程中,`Lock`是用于控制多线程并发访问共享资源的关键字,它提供了线程同步机制,确保同一时间只有一个线程可以访问特定的代码块,从而避免数据竞争和不一致的问题。本实例将通过模拟ATM机存取款业务来深入...
- **锁**:`lock`语句提供简单的互斥访问,确保同一时间只有一个线程访问受保护的资源。 - **Monitor**:使用`Monitor.Enter()`和`Monitor.Exit()`进行精确的线程同步,防止死锁。 - **Mutex**:跨进程的互斥锁,...
2. **Lock锁效率**:在需要多个线程共享数据的情况下,如果能够精确控制同步范围,Lock锁可能比`synchronized`更具优势。Lock提供了更多的控制选项,如尝试获取锁、可中断等待等,这些特性使得在某些情况下可以提高...