C# 中使用Lock关键字



一、Lock定义

lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。

而在.NET中最好了解一下进程、应用域和线程的概念,因为Lock是针对线程一级的,而在.NET中应用域是否会对Lock起隔离作用,我的猜想是,即不在同一应用域中的线程无法通过Lock来中断;另外也最好能了解一下数据段、代码段、堆、栈等概念。

在C# lock关键字定义如下:

lock(expression) statement_block,其中expression代表你希望跟踪的对象,通常是对象引用。

如果你想保护一个类的实例,一般地,你可以使用this;如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。

而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

二. lock的含义lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使用它至关重要:1. objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。2. lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。3. 执行完codeB之后释放objectA,并且codeB可以被其他线程访问。

三. lock的使用

Singleton{SingletonCreateInstance(){

{}return_instance;}}

上例是定义了一个单例的示例.

但是上例没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。因此,需对上面代码修改。

这个时候就可以使用LOCK()

publicclass Singleton{ privatestatic Singleton instance;(); private Singleton() { } publicstatic Singleton GetInstance() {

){lock(_lock){){instance=new Singleton();}}}return instance;}}

上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),,才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销.

也站在未路让我牵挂的人。

C# 中使用Lock关键字

相关文章:

你感兴趣的文章:

标签云: