当前位置: 首页 > news >正文

关于使用Lock的疑问。

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

这里是他给的示例代码
ExpandedBlockStart.gif ContractedBlock.gif class  Transaction  dot.gif {
InBlock.gif
InBlock.gif   
// Private, static Object field 
InBlock.gif   
// used purely for synchronization
InBlock.gif
   private static Object objLock = new Object();
InBlock.gif
InBlock.gif   
// Private field holding the time of 
InBlock.gif   
// the last transaction performed
InBlock.gif
   private static DateTime timeOfLastTransaction;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public static void PerformTransaction() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif      
lock (objLock) dot.gif{
InBlock.gif         
// Perform the transactiondot.gif
InBlock.gif
InBlock.gif         
// Record time of the most recent transaction
InBlock.gif
         timeOfLastTransaction = DateTime.Now;
ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif   }

InBlock.gif
InBlock.gif   
// Public read-only property returning
InBlock.gif   
// the time of the last transaction
ExpandedSubBlockStart.gifContractedSubBlock.gif
   public static DateTime LastTransaction dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif      
get dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif         
lock (objLock) dot.gif{
InBlock.gif            
// Return the time of the last transaction 
InBlock.gif
            return timeOfLastTransaction;
ExpandedSubBlockEnd.gif         }

ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

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



相关文章:

  • ASP.NET MVC5----基本用法
  • 网络分析的发展
  • Web前端MVC框架
  • jquery笔记之属性选择器 查找以某种条件开头的页面元素
  • 分享:微软提供的一个开源控件treeview 的一小个用法
  • com.panie 项目开发随笔(NoF)_环境搭建(2016.12.29)
  • 鲁棒的数据库持久层设计
  • java 线程 障碍器
  • 利用WSS做后台存储--设计一个统一的信息发布平台
  • Java foreach操作(遍历)数组
  • lduan server 2012 远程桌面网络高可用(二十三)
  • ASP.NET Theme/aspnet_regiis -ga/aspnet_regsql
  • easyUI中onLoadSuccess方法获取多个对象
  • signalr推送消息
  • 老鼠Atlas之旅(八):Hands-On Lab 4第四个实验,Atlas服务器控件自动完成
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2018一半小结一波
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • HomeBrew常规使用教程
  • java小心机(3)| 浅析finalize()
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • MySQL用户中的%到底包不包括localhost?
  • PaddlePaddle-GitHub的正确打开姿势
  • 记录一下第一次使用npm
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么是Javascript函数节流?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 优秀架构师必须掌握的架构思维
  • 阿里云API、SDK和CLI应用实践方案
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #数学建模# 线性规划问题的Matlab求解
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (70min)字节暑假实习二面(已挂)
  • (8)STL算法之替换
  • (pojstep1.3.1)1017(构造法模拟)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)WCF的Binding模型
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (转)Windows2003安全设置/维护
  • (转)母版页和相对路径
  • (转)我也是一只IT小小鸟
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .CSS-hover 的解释
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net framework profiles /.net framework 配置
  • .NET Micro Framework初体验
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net中调用windows performance记录性能信息