日期:2014-05-17  浏览次数:20470 次

LOCK 相关,非常疑惑不解。
假设有一个Class1静态类中包含一个 Dictionary字段

N多页面要对这个Dictionary 读取,增加和删除元素。 现在我经常碰到移除已经被移除了的元素或者赋值的时候元素已经被移除了。 于是就想起了Lock 但是不知道怎么用最合适。

1

private static object lock1 = new object();
Lock(lock1)
{
    Class1 类 Dictionary 操作代码
}


2

Lock(this)
{
    Class1 类 Dictionary 操作代码
}


3

Lock(Class1)
{
    class1 类 Dictionary 操作代码
}




问:怎么Lock 才能保证锁定过程中Class1不能被任何线程访问 

------解决方案--------------------
引用:
Class1静态类中包含一个 Dictionary字段
 class1
{
 lock(Dictionary)
{}
}

瞎扯的,不知道正确不
------解决方案--------------------
Dictionary本身不是线程安全的吧?最好不要暴露出去
然后lock锁住的是代码段
------解决方案--------------------
使用第一种。
------解决方案--------------------
使用第一个。
------解决方案--------------------
以下来自msdn:
http://msdn.microsoft.com/zh-cn/library/c5kehkcz(v=vs.80).aspx

lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
线程处理(C# 编程指南) 这节讨论了线程处理。
lock 调用块开始位置的 Enter 和块结束位置的 Exit。
通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则
如果实例可以被公共访问,将出现 lock (this) 问题。
如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。
最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
------解决方案--------------------
lock只是解决了当前的同时操作,但下一个人的操作还是要做判断的
------解决方案--------------------
个人觉得 findcaiyzh 和sp1234 的观点正确

10#代码不具有线程等待的作用;
13#理解有偏颇,一个是线程锁,一个是业务,不是这么理解的。