装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

工具

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

广告



访客

 

在.NET开发中,保持线程安全的默认手段是采用System.Threading.Monitor加锁以确保对共享数据访问的同步性。我们已经很习惯于用SyncLock语句来实现这个功能。但是锁住什么变量也是有讲究的。如果一个线程过程所用的同步变量被别的过程锁住而又不放开的话,这个线程就会陷入永久的沉睡。普遍方案是:

1、锁住被访问的数据本身。对于只存在一种线程过程的情况可以使用,但若有很多种不同的线程过程都要访问这数据,就很危险了。

2、锁住容器的实例。常见是锁住thMe。也有锁住Me.GetType()的,都是相似的原理。这种方法的最大缺陷就是Me尤其是Me.GetType()都是可以被对象外部访问到的对象,如果从外部锁住他们而且不放开,对象内的线程就被锁死了。这是相当危险的。

3、锁住特殊的同步根。常常是类型的字段,没有任何功能,只是用来维持同步的。这种变量从外部是无法锁住的,但类内部的其他过程仍可锁住他们,导致死锁。

所以我想出一种方案:锁住局部静态变量。如下所示:

Static syncRoot As New Object()
LyncLock syncRoot
    'Code
End SyncLock

局部静态是无法被其他过程访问的,因此这个同步根就成了本线程过程专用的。不用担心任何其他人可以锁住它。而局部静态变量的生命周期与类的字段一样,完全可以胜任这个工作。


随贴广告(测试期)
相关文章

打印 | 张贴于 2004-08-26 08:37:00 | Tag:灵感记录

留言反馈

re: 锁住局部静态变量确保线程安全 编辑
asp.net当中不好用lock的,会出问题。出处我记不清楚了,建议你好好再查一查。
2005-11-28 21:04:00 | [匿名用户:zhangyin]
re: 锁住局部静态变量确保线程安全 编辑
关于线程安全:
如果某函数是不可重入的,则它不是线程安全的!
至于是否可重入,就可以根据这个函数是否使用了静态存储的数据判断了!

从语意上说,静态存储数据包括全局变量和局部静态变量,它们都是存储在堆上的.而线程间是共享同一进程空间的,所以它们共享相同的静态存储数据, 所以...
对于可重入函数来说,如果下一次函数调用对上一次调用产生影响的话,那么该函数就是不可重入函数了.
楼主,你的说法有些不妥吧?
2005-11-28 11:19:00 | [匿名用户:david]
re: 锁住局部静态变量确保线程安全 编辑
楼主说的。我看的不是很懂呀。。晕。
2004-08-31 14:39:00 | [匿名用户:goker]
re: 锁住局部静态变量确保线程安全 编辑
Web 应用程序中显得更为重要。比如:web service 中得排他访问
2004-08-27 09:02:00 | [匿名用户:montaque]
re: 锁住局部静态变量确保线程安全 编辑
只指同一个Function或Sub,但不是同一个线程。你恰好和我想表达的意思相反。
2004-08-26 10:15:00 | [匿名用户:Ninputer]
re: 锁住局部静态变量确保线程安全 编辑
什么是本线程过程? 是指在同一个线程中运行的function或者sub么? 既然是同一个线程,还要锁嘛? :)

嘿嘿,可能是偶没有完全理解你要表达的意思。
2004-08-26 08:52:00 | [匿名用户:rIPPER]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System