- 浏览: 204442 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (231)
- C++学习 (41)
- vc学习 (25)
- vc异常 (4)
- Flex (2)
- Ext (0)
- java学习笔记 (15)
- mysql学习笔记 (1)
- ibatis学习笔记 (7)
- struts1学习笔记 (1)
- hibernate学习笔记 (3)
- javascript学习笔记 (8)
- eclipse快捷键 (2)
- 英语学习 (1)
- cmd (1)
- eclipse 配置 (2)
- 其他 (4)
- JAVASE (34)
- firefox (1)
- linux (8)
- Apache (6)
- cms (22)
- jsuc (10)
- html (3)
- css (1)
- 作图 (2)
- vs2012 (2)
- 编码转换 (12)
- work_unicode (1)
- work_webbrowser (1)
- work_trade_quotes_login (1)
- c#学习 (38)
- wpf学习 (31)
- wpf快速学习 (1)
- VB学习 (1)
- NSIS (4)
- log4cpp (3)
- 学习web (1)
- 经验 (1)
- c_汇编 (1)
最新评论
C#笔记21:多线程之线程同步中的锁定lock、Monitor
1:什么是锁
2:如何选择锁定对象
3:如何锁定集合
4:Monitor
1:什么是锁
lock 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
2:如何选择锁定对象
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上面的示例中,锁的范围限定为此函数,因为函数外不存在任何对对象 lockThis 的引用。如果确实存在此类引用,锁的范围将扩展到该对象。严格地说,提供的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
复制代码
public class TestThreading
{
private System.Object lockThis = new System.Object();
public void Process()
{
lock (lockThis)
{
// Access thread-sensitive resources.
}
}
}
复制代码
通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行时 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。
3:如何锁定集合
每个非泛型集合,都提供了一个SyncRoot的属性,如果要锁定集合,请锁定此属性。遗憾的是,我们现在已经不鼓励使用非泛型集合了,所以,泛型集合的锁定,请自己选择或创建一个锁定对象来实现。
4:Monitor
lock代码在经编译后,会自动转换为Monitor代码,所以两者没有任何区别。唯一的区别就在于lock使用起来更加简单。
复制代码
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
1:什么是锁
2:如何选择锁定对象
3:如何锁定集合
4:Monitor
1:什么是锁
lock 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
2:如何选择锁定对象
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上面的示例中,锁的范围限定为此函数,因为函数外不存在任何对对象 lockThis 的引用。如果确实存在此类引用,锁的范围将扩展到该对象。严格地说,提供的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
复制代码
public class TestThreading
{
private System.Object lockThis = new System.Object();
public void Process()
{
lock (lockThis)
{
// Access thread-sensitive resources.
}
}
}
复制代码
通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行时 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。
3:如何锁定集合
每个非泛型集合,都提供了一个SyncRoot的属性,如果要锁定集合,请锁定此属性。遗憾的是,我们现在已经不鼓励使用非泛型集合了,所以,泛型集合的锁定,请自己选择或创建一个锁定对象来实现。
4:Monitor
lock代码在经编译后,会自动转换为Monitor代码,所以两者没有任何区别。唯一的区别就在于lock使用起来更加简单。
复制代码
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
发表评论
-
byte数组直接输出
2016-07-19 11:38 1249byte数组直接输出 BitConverter.ToStrin ... -
wfi:WindowsFormsHost焦点设置
2016-07-05 17:56 580<wfi:WindowsFormsHost> ... -
C#_WPF_WPF用户控件库
2016-04-12 11:37 798新建项目》window桌面》WPF用户控件库 -
DependencyProperty.UnsetValue_WPF涉及到资源的嵌套引用,被引用的资源要定义在引用的资源前面
2015-10-27 15:09 1992错误 1 “{DependencyProperty.Unset ... -
string格式的日期时间字符串转为DateTime类型
2015-08-05 14:22 963string格式的日期时间字符串转为DateTime类型 / ... -
checkbox
2015-07-28 17:18 554private void Chec ... -
自定义DataGrid样式
2015-06-26 22:03 747<ResourceDictionary xmlns=&q ... -
x:Name x:Key Name区别
2015-06-25 15:40 597x:Name x:Key Name区别 1、x:Key 只 ... -
work_代码添加
2015-06-23 17:15 507<UserControl x:Class=" ... -
FindName和VisualTreeHelper
2015-06-19 13:23 756int iCount = this.dataGridCan ... -
理解WPF中的视觉树和逻辑树(转载)
2015-06-19 13:00 586理解WPF中的视觉树和逻辑树 理解WPF中的 ... -
理解WPF中的视觉树和逻辑树(转载)
2015-06-19 12:58 1681理解WPF中的视觉树和逻 ... -
GetEnumerator
2015-06-19 12:39 651IEnumerator enumerator = this ... -
资源文件获取配置
2015-06-18 16:03 369object obj = Application.Curren ... -
Pack URI
2015-06-18 15:41 685主要用来定位 资源文 ... -
wpf学习之ObservableCollection<T>相关知识
2015-04-23 11:10 3305本篇学习了ObservableCollection<T& ... -
C#学习之DateTime
2015-04-23 10:30 450DateTime string.Format("{ ... -
c#学习之TimeSpan
2015-04-23 10:29 7981 DateTime dateNow = DateTime ... -
XML特殊字符和空格 换行 转义符(转)
2015-03-25 16:27 6209XML特殊字符和空格 换行 ... -
C#:struct的陷阱:无法修改“xxx”的返回值,因为它不是变量(转)
2015-03-25 14:01 1415C#:struct的陷阱:无法修改“xxx”的返回值,因为它不 ...
相关推荐
以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...
通过上述知识点的介绍,我们可以看到C#中的多线程编程涉及到很多细节和技术点,理解并掌握这些内容对于编写高效、稳定的多线程应用程序至关重要。希望以上内容能够帮助大家更好地理解和应用C#中的多线程技术。
本笔记将深入探讨C#中的多线程编程,包括其基本概念、创建线程的方式、线程同步与互斥、线程安全以及线程池的使用。 ### 1. 基本概念 - **线程**:线程是程序的执行流程,每个进程至少包含一个线程。多线程意味着...
- **c#多线程编程笔记.rar**:可能是一位开发者的经验总结,包含了实践中的技巧和陷阱,对于理解和应用多线程编程非常有价值。 掌握这些知识后,无论是初学者还是中高级开发者,都能在C#环境下高效地编写多线程应用...
为了保护应用程序的资源不被破坏,为多线程程序提供了三种加锁的机制,分别是:Monitor类、Lock关键字和Mutex类。 1. lock lock实现的功能是:使后进入的线程不会中断当前的线程,而是等待当前线程结束后再继续执行...
1. 线程同步:在多线程环境中,同步是确保数据一致性、防止数据竞争的关键。C#提供了多种同步机制,如Mutex、Semaphore、Monitor、Lock和EventWaitHandle等。 2. 死锁:当两个或更多线程相互等待对方释放资源,导致...
个人工作和学习中积累和总结的多线程笔记 包含异步 线程等待 线程异常 线程终止 线程安全 lock monitor mutex autoresetevent semephore readerwriterlock readerwriterlockslim
`Monitor`类提供`Enter()`和`Exit()`,相当于VB中的`SyncLock`或C#的`lock`关键字。`ReaderWriterLock`用于读写锁,`Mutex`和`AutoResetEvent`是事件同步工具,`Interlocked`类则提供了原子操作,如`i++`的线程安全...
在IT领域,线程编程是多任务处理的核心技术,特别是...通过实际编写和理解这些代码示例,你可以更好地掌握线程的使用,提升多线程编程技能,解决并发问题,提高程序性能。实践中不断学习和调试,是提升编程能力的关键。
5. **多线程**:线程的基本概念、同步机制(synchronized,Lock)、线程池,以及并发容器如ConcurrentHashMap。 6. **IO流**:输入输出流分类、缓冲流、对象流、字符流的使用,以及NIO(New IO)框架。 7. **反射*...
C#提供了`lock`语句、`Monitor`类、`Mutex`、`Semaphore`等同步原语,以及`async/await`关键字来处理并发问题。 5. **状态管理(State Management)**:在处理任务时,保持状态的一致性至关重要。这可以通过使用...