C#线程安全对象的内部实现
2010-01-07 09:39
169 查看
原则:
1、读写互斥操作某个数据对象,这在多线程中经常使用,可用lock实现安全的互斥访问
本质上,线程安全的对象其内部实现也是基于这种设计
2、一个list,有get,set方法,需要get与set互斥访问:
设计一个类,具有数据成员list,get方法,set方法
类名为SecureList,在get和set方法的执行代码中操作list,代码置于lock(this){}代码块中,这样就可实现线程安全。
3、数据分析过程:
一个SecureList的实例化对象开辟了一块内存来存放list对象,这个list对象当然是属于this对象(即当前的SecureList实例对象)的组成部分,在sl.get()的时候,执行到lock(this)的时候,去查看sl这个对象的引用情况,如果当前一个线程正在set的过程中,则this对象是lock住的,此时sl.get()等待set操作的完成,set完成之后通知本线程this对象已经解锁,get操作从等待队列中取出从而开始执行,这样实现了对同一数据的线程安全访问。
list对象是SecureList对象的组成部分,锁定了SecureList对象,自然list对象也锁定的,实现对list这个数据对象的线程安全访问。
多线程之间的锁的维护(也就是对数据对象操作者信息的维护)在本质的实现上和引用类型对象的引用计数一样实现即可,在引用类型对象的创建时,这个对象的引用计数,生存期等等信息都有OS来维护,所谓的垃圾回收机制也正是利用了OS维护的这个信息(比如,当引用计数为0的时候,OS便可以析构这个对象,回收已分配的内存)。同样地,我们对某一对象的使用,也由进程统计起来(进程由OS管理,终归OS管理),当有一个操作指明要独占访问这个资源的时候,就设置一个标记,在操作好之后标记重置,其他要访问这个对象的代码(内部每个对象的访问都是先做这样的操作的)首先检查标记,如果已设置,就把线程suspend,等待OS事件通知(解锁事件通知),再转入exe
cute状态。
1、读写互斥操作某个数据对象,这在多线程中经常使用,可用lock实现安全的互斥访问
本质上,线程安全的对象其内部实现也是基于这种设计
2、一个list,有get,set方法,需要get与set互斥访问:
设计一个类,具有数据成员list,get方法,set方法
类名为SecureList,在get和set方法的执行代码中操作list,代码置于lock(this){}代码块中,这样就可实现线程安全。
3、数据分析过程:
一个SecureList的实例化对象开辟了一块内存来存放list对象,这个list对象当然是属于this对象(即当前的SecureList实例对象)的组成部分,在sl.get()的时候,执行到lock(this)的时候,去查看sl这个对象的引用情况,如果当前一个线程正在set的过程中,则this对象是lock住的,此时sl.get()等待set操作的完成,set完成之后通知本线程this对象已经解锁,get操作从等待队列中取出从而开始执行,这样实现了对同一数据的线程安全访问。
list对象是SecureList对象的组成部分,锁定了SecureList对象,自然list对象也锁定的,实现对list这个数据对象的线程安全访问。
多线程之间的锁的维护(也就是对数据对象操作者信息的维护)在本质的实现上和引用类型对象的引用计数一样实现即可,在引用类型对象的创建时,这个对象的引用计数,生存期等等信息都有OS来维护,所谓的垃圾回收机制也正是利用了OS维护的这个信息(比如,当引用计数为0的时候,OS便可以析构这个对象,回收已分配的内存)。同样地,我们对某一对象的使用,也由进程统计起来(进程由OS管理,终归OS管理),当有一个操作指明要独占访问这个资源的时候,就设置一个标记,在操作好之后标记重置,其他要访问这个对象的代码(内部每个对象的访问都是先做这样的操作的)首先检查标记,如果已设置,就把线程suspend,等待OS事件通知(解锁事件通知),再转入exe
cute状态。
相关文章推荐
- C# Synchronized 和 SyncRoot 实现线程同步的源码分析及泛型集合的线程安全访问
- C# Synchronized 和 SyncRoot 实现线程同步的源码分析及泛型集合的线程安全访问
- C#中Queue的线程安全问题
- 【翻译三】java-并发之线程对象和实现
- 利用C#线程机制实现应用程序的单实例运行
- C#实现对象的Xml格式序列化及反序列化
- 获得Sql Server 2005 中任意对象创建脚本的C#实现
- HttpApplication 对象的创建过程及HttpModule过滤器的内部实现过程
- 利用C#线程机制实现应用程序的单实例运行
- C#通过StreamWriter对象实现把数值内容写到记事本
- C# :线程中操作多控件 (委托实现异步及同步的方法)
- 学习笔记:c# 从“过程”看“对象”----类及基础的实现
- 线程安全,有状态,无状态的对象
- 编写高质量代码改善C#程序的157个建议——建议22:确保集合的线程安全
- C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现
- 第10天(就业班) servlet的映射路径、生命周期、自动加载+init方法+线程并发安全、servletconfig对象+servletcontext对象入门、servletcontext对象的使
- C#实现对象的Xml格式序列化及反序列化
- 点击button按钮后,启动一个实现鼠标拖动另一个button的线程 (JFrame/C# WinForm)
- C++实现一个线程安全且高效单例类
- 在C#中主线程和子线程如何实现互相传递数据