[倾情原创] 锁·二则——lock关键字详解

Timothy Liu 2005-12-25 05:43:16
摘要:多线程同步是个非常有趣的话题。lock关键字在线程同步中起着非常重要的作用,然而市面上的书籍对lock关键的解释都非常粗略,MSDN中的代码也不是很透彻。本文以lock关键字为核心,稍展多线程的议题,以补市面书籍所缺,或许能博您一笑。另一并祝各位新年快乐:D

小序
锁者,lock关键字也。市面上的书虽然多,但仔细介绍这个keyword的书太少了。MSDN里有,但所给的代码非常零乱,让人不能参透其中的玄机。昨天是平安夜,今天自然就是圣诞节了,没别的什么事情,于是整理了一下思路,使用两个例子给大家讲解一下lock关键字的使用和一点线程同步的问题。
……
详细内容:http://blog.csdn.net/FantasiaX/archive/2005/12/25/561797.aspx
...全文
252 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
diandian82 2006-03-26
  • 打赏
  • 举报
回复
上面的情况我觉得应该退出领界区了吧
diandian82 2006-03-26
  • 打赏
  • 举报
回复
学习
nonocast 2006-03-26
  • 打赏
  • 举报
回复
//为了能够作为线程的入口点,程序必需是无参、无返回值

可以是有参数的,用ParameterizedThreadStart就可以咯

我关心的倒是
lock(xxx){
throw new Exception();
}
这种情况怎么办
y1g1y1 2005-12-26
  • 打赏
  • 举报
回复
o
Timothy Liu 2005-12-26
  • 打赏
  • 举报
回复
奉献一下:D
tiaoci 2005-12-26
  • 打赏
  • 举报
回复
没有说你有错误啊,只是说存在潜在的问题~~~~

我比较狂那又怎样啊,你还能吃了我,咔咔

以下转自MSDN,我觉得已经说得很清楚了啊
---------------------------------------
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。严格地说,提供给 lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。

通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。

Timothy Liu 2005-12-26
  • 打赏
  • 举报
回复
挑刺君:
麻烦您花心思看看,哪里有错误.不妨指教一二----潜在的问题在哪里??
另外,您都已经一颗五角星了,想一想,还有多少人只穿一个裤头呢.你感觉简单,初学者未必感觉简单.相信您也是从那时候过来的吧.小人得志的事儿咱们最好谁也别干.
还有,我是无党派人士.
我感觉你应该学学你楼上的兄弟,人家都俩五星了,也没像你这么狂,而是给予补充和支持(谢谢撒!).
tiaoci 2005-12-26
  • 打赏
  • 举报
回复
另外,你的代码有误导之嫌,我没心思全部看,但是其中的:

lock(typeof(ATM))
lock(this)

这样的代码会存在潜在的问题,因此要避免使用
tiaoci 2005-12-26
  • 打赏
  • 举报
回复
靠,这么简单的东西搞这么复杂

怀疑你是党员出身~~~~~

lock:
确保不同线程不会在同一时间执行 lock 块之间的代码
ChengKing 2005-12-26
  • 打赏
  • 举报
回复
加一个:

(六)线程--分别用lock以及Interlicked和Monitor类实现线程的临界区操作(互斥):
http://blog.csdn.net/chengking/archive/2005/11/30/540644.aspx

more Thread Study article:
http://blog.csdn.net/ChengKing/category/160892.aspx

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧