关于使用Lock的疑问。

这里是Jeffrey Richter关于线程锁定的文章
http://www.microsoft.com/china/msdn/library/security/dotnetsecurity/mismsdnmagissues0301net.mspx?pf=true#EGAA
关于使用lock的注意

这里是他给的示例代码
class Transaction {

   
// Private, static Object field 
   
// used purely for synchronization
   private static Object objLock = new Object();

   
// Private field holding the time of 
   
// the last transaction performed
   private static DateTime timeOfLastTransaction;

   
public static void PerformTransaction() {
      
lock (objLock) {
         
// Perform the transaction

         
// Record time of the most recent transaction
         timeOfLastTransaction = DateTime.Now;
      }

   }


   
// Public read-only property returning
   
// the time of the last transaction
   public static DateTime LastTransaction {
      
get 
         
lock (objLock) {
            
// Return the time of the last transaction 
            return timeOfLastTransaction;
         }

      }

   }

}


下面是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 对象,以专门用于锁定字段集。锁定操作的粒度性越高,代码所获得的性能和可伸缩性就越好。



原文地址:https://www.cnblogs.com/king_astar/p/217012.html