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



  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/king_astar/p/217012.html
Copyright © 2020-2023  润新知