http://www.microsoft.com/china/msdn/library/security/dotnetsecurity/mismsdnmagissues0301net.mspx?pf=true#EGAA
关于使用lock的注意
这里是他给的示例代码
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
下面是Jeffrey Richter对这个问题的说明,我还不是很明白,哪位请指点一下。。
幸运的是,该问题有一个解决方案。但是,这意味着您必须忽视 Microsoft 设计和建议。您必须将一个私有的 System.Object 字段定义为您的类型的成员,构建对象,然后使用 C# lock 或 Visual Basic .NET SyncLock 语句,并且传入对私有对象的引用。图 8 显示了如何重写 Transaction 类,以便使用于同步的对象是类对象所私有的。同样,图 9 显示了如何重写所有成员都是静态成员的 Transaction 类。
仅仅为了通过 Monitor 类进行同步,就必须构建一个 System.Object 对象,这似乎有些奇怪。在静下心来完成这一工作时,我感到 Microsoft 设计 Monitor 类的方式不正确。该类的设计应该使开发人员便于为其打算同步的每个类型构建一个 Monitor 类型的实例。然后,静态方法应当是无需使用 System.Object 参数的实例方法。这会解决上述所有问题,并且为开发人员切实简化编程模型。
顺便说一下,如果创建带有很多字段的复杂类型,则方法和属性可能在任何时候都只需要锁定对象的字段子集。可以通过将特定字段的对象传递给 lock 或 Monitor.Enter 来始终锁定该特定的字段。当然,我只在字段是私有字段时才会考虑这样做(我始终建议如此)。如果您要将多个字段锁定在一起,则也可以使用其中一个字段作为您总是传递给 lock 或 Enter 的字段。或者,您可以构建一个 System.Object 对象,以专门用于锁定字段集。锁定操作的粒度性越高,代码所获得的性能和可伸缩性就越好。