您的位置:首页 > 编程语言 > C#

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状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: