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



  • 相关阅读:
    卸载IE
    js判断是否是object、array
    正则表达式中/i,/g,/ig,/gi,/m的区别和含义
    谷歌地图控制圆圈随缩放自适应大小 js
    WGS84坐标转换GCJ02坐标 JS实现
    Google图片和NASA 网站图片的爬虫
    Yolov_3 网络结构分析
    启动Tensorboard时发生错误:class BeholderHook(tf.estimator.SessionRunHook): AttributeError: module 'tensorflow.python.estimator.estimator_lib' has no attribute 'SessionRunHook'
    MyBatis -- generator 逆向工程
    bat使用方法汇总
  • 原文地址:https://www.cnblogs.com/king_astar/p/217012.html
Copyright © 2011-2022 走看看