C# 关于线程锁lock的使用方法
2016-09-02 10:07
417 查看
在多线程编程中,可能会有许多线程并发的执行一段代码(代码块A),以提高执行效率。在某些情况下,我们希望A中的代码块(B)同步的执行,即同一时刻只有一个线程执行代码块B,这就需要用到锁(lock)。lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。
其写法如下:
Object locker =
new Object();
lock(locker)
{
B //同步执行的代码
}
其相当于如下代码:
//System.Threading.Moniter.enter(Object),Moniter类提供同步访问对象的机制,enter方法在指定对象上获取排他锁,之后其他线程不能再次获取,直到释放
Monitor.enter(locker);
{
B
}
[b]Monitor.exit(locker); [/b]//exit(Object)释放指定对象上的排他锁。
lock 语句的表达式必须表示一个引用类型的值。永远不会为 lock 语句中的表达式执行隐式装箱转换,因此,如果该表达式表示的是一个值类型的值,则会导致一个编译时错误。
C#中引用类型主要有:数组、类、接口、委托、object、字符串,但是最好不要锁字符串;使用lock同步时,应保证lock的是同一个对象,而给字符串变量赋值并不是修改它,而是重新创建了新的对象,这样多个线程以及每个循环之间所lock的对象都不同,因此达不到同步的效果。常用做法是创建[b]一个object对象,并且永不赋值。[/b]
下面举个简单的例子,一群苦逼程序员被逼捐款,每人100:
其写法如下:
Object locker =
new Object();
lock(locker)
{
B //同步执行的代码
}
其相当于如下代码:
//System.Threading.Moniter.enter(Object),Moniter类提供同步访问对象的机制,enter方法在指定对象上获取排他锁,之后其他线程不能再次获取,直到释放
Monitor.enter(locker);
{
B
}
[b]Monitor.exit(locker); [/b]//exit(Object)释放指定对象上的排他锁。
lock 语句的表达式必须表示一个引用类型的值。永远不会为 lock 语句中的表达式执行隐式装箱转换,因此,如果该表达式表示的是一个值类型的值,则会导致一个编译时错误。
C#中引用类型主要有:数组、类、接口、委托、object、字符串,但是最好不要锁字符串;使用lock同步时,应保证lock的是同一个对象,而给字符串变量赋值并不是修改它,而是重新创建了新的对象,这样多个线程以及每个循环之间所lock的对象都不同,因此达不到同步的效果。常用做法是创建[b]一个object对象,并且永不赋值。[/b]
下面举个简单的例子,一群苦逼程序员被逼捐款,每人100:
相关文章推荐
- C# 关于线程锁lock的使用方法
- C# 关于线程锁lock的使用方法
- 关于C#Winform线程调用窗体的使用方法以及窗体的单一显示
- 关于C#Winform线程调用窗体的使用方法以及窗体的单一显示
- 关于C# WinForm FastReport Studio的使用方法:
- C#中用Invoke调用控件方法和BeginInvoke线程使用方法
- 每隔一段时间自动执行一次某个方法(使用线程)[C#]
- C# 线程手册 第三章 使用线程 ReaderWriterLock 类
- 一起谈.NET技术,关于C#线程,线程池和并行运算的简单使用和对比
- C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
- C# 线程的各种知识,和使用方法
- 每隔一段时间自动执行一次某个方法(使用线程)[C#]
- C#线程的使用方法简介
- C#线程使用方法
- 关于C#线程,线程池和并行运算的简单使用和对比
- C#中关于使用Uri来找项目中文件路径的方法
- C#线程 BeginInvoke和EndInvoke使用方法
- 关于 C#异步方法的使用
- 关于C#线程,线程池和并行运算的简单使用和对比
- 在C#.NET中,关于<%%>使用方法