对于任何一个对象来说,他在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock.什么意思呢?就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用Monitor.Exit(object)将索引变为负数。
1.不建议lock public性质的类或者属性。例如 lock(this) 或者lock pubilic属性。 容易导致死锁。
2.建议lock住私有的静态成员变量。
3.lock住私有非静态变量的,只能保护实例的成员数据,如果临界区是非实例本身的资源或者行为,需要谨慎。
原文:http://www.cnblogs.com/wuMing-dj/p/4901317.html