1、从“最简单”的单例模式说起:

publicclass Singleton
{
privatestatic Singleton instance =null;
privatestaticreadonlyobject syncRoot =newobject();

private Singleton()
{
}

publicstatic Singleton GetInstance()
{
if (instance ==null)
{
lock (syncRoot)
{
if (instance ==null)
{
instance =new Singleton();
}
}
}
return instance;
}
}

  稍微了解设计模式基础知识的人对上面的代码应该不会陌生。上次去面试,主考官就让楼猪写个单例。虽然平时已经很久没有刻意去使用设计模式编程了,但是对于这个单例模式,咩哈哈,虽然大丈夫喜怒不形于色,但是nc楼猪当时那个意气风发踌躇满志运笔如飞锋芒毕露啊,嘿嘿,中规中矩地交了如上答案。面试官看了一下肯定了两句,话锋一转,问lock那里的object实例可以直接用instance替代吗?new一个object是否多余,可否写成下面的形式:

publicclass Singleton
{
privatestatic Singleton instance =null;
//private static readonly object syncRoot = new object();

private Singleton()
{
}

publicstatic Singleton GetInstance()
{
if (instance ==null)
{
lock (instance)//instance能替换syncRoot吗?
{
if (instance ==null)
{
instance =new Singleton();
}
}
}
return instance;
}
}

  虽然在这个问题前面,面试官问的一个数据库设计和几个c#的小问题(有一个题楼猪当时竟然嘴硬说那是“奇技淫巧”,好怕怕)很见知识深度和修养,楼猪已经小有提防,但是这个问题还是再次让楼猪自乱阵脚。以前从来没人问过楼猪这个问题,楼猪也没主动想过它,脑袋里一片白茫茫,刚想要镇定下来,面试官又把相同问题问了一遍。不及细想,虽然不能确定,但是还是回答“应该可以...吧”(语气助词用得妙啊)。
  肯定是对这个回答和回答的语气不满意,面试官又提醒问lock机制是什么样的,说说c#大概是怎么实现lock的。楼猪语无伦次说lock本质上和操作系统相关,lock就是当前线程将资源独占其他线程不能访问该锁定资源云云,背书都不会背了吗?无语了。面试官说回去自己试试吧。听他的语气,答案当然不言自明了,小心灵遭受重大挫折和打击啊。
  回来后,验证了一下面试官的问题,程序运行到lock的时候,抛出ArgumentNullException异常,“值不能为null”。为什么lock一个指向null的引用实例不可以呢?
查了一下中文msdn:

lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

老实说,直到看到最后一句“对象被释放”才给了楼猪提示。某一对象可以指向null引用,但是null关键字是不需要释放的吧?!是吗?查了一下高人anytao的博客,发现这篇认识全面的null给出了明确的答案。
接着楼猪又查看了一下经常可以替代lock的Monitor类,赫然发现它的静态方法Enter(object obj)有一个异常类型ArgumentNullException,早知道,也不会那么狼狈啊。

2、lock的陷阱
除了msdn里提到的lock需要注意的两点外,园子里早就有高手总结过了,可以参考这一篇。

3、最后自己总结得出的三个结论:
a、c#中null是不能lock的(null会分配内存吗,会占用系统资源吗?和楼猪一起思考和探讨吧)。
b、高手一出手,往往可以化腐朽为神奇。
c、对自己说:
加油。

转载于:https://www.cnblogs.com/miaomiaosdad/archive/2012/03/28/2421423.html

浅谈c#中使用lock的是与非相关推荐

  1. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  2. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  3. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置

    声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...

  4. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  5. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  6. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  7. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

    浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...

  8. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  9. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

最新文章

  1. keras 的 example 文件 addition_rnn.py 解析
  2. 波涛汹涌的黄金甲,一碗中药引发的血案!
  3. uni-app中的页面间使用$on与$emit
  4. 參加microsoft主管信息論壇
  5. 数据结构之并查集:UF-Tree优化并查集——19
  6. template 模板是怎样通过 Compile 编译的
  7. 将字符串放到字符串数组中
  8. 服务器位置设置,服务器部署位置
  9. 为什么Stc-isp一直在检测单片机
  10. chrome浏览器插件安装步骤
  11. 查看计算机温度指令,怎么看cpu温度(电脑CPU温度怎么查看?)
  12. 2018年清华大学民商法学考研经验分享
  13. 电脑怎么图片转文字?建议收藏这几个方法
  14. 关于office2016 程序停止运行。。。的问题
  15. HaploMerger2: 从高杂合二倍体基因组组装中重建单倍型
  16. 秋季,高级灰这样搭配,怪不得这么潮!
  17. ADB操作手机的一个界面小工具(python实现)
  18. 在一个js文件中引入另一个js文件
  19. IC基础知识(八)ROM、PROM、EPROM、EEPROM和Flash之间的区别
  20. 新能源储能仪表推荐-ACR10R-D16TE4 防逆流仪表通讯接线及Modbus-RTU协议通讯表说明

热门文章

  1. 通过安装和配置AD域解决Windows Server 2016的IIS无法加载SMB文件卷文件的问题
  2. vue升级之路(四)-- Vuex
  3. 快速接入阿里云应用配置管理工具 轻松开启企业效率新时代
  4. CCN(content centric networking)介绍
  5. 关于APP性能测试脚本录制的四种方法
  6. Fedora 11 Beta 跳票了
  7. Serv-U组建个人FTP服务器, ——完全图解教程:FTP架设、端口映射、动态域名申请...
  8. X86汇编语言从实模式到保护模式19:分页和动态页面分配
  9. php检测网页内容,php检测网页是否被百度收录函数的简单示例
  10. 为什么空集是集合的子集_「离散数学」1.41.5特殊的集合和集合的计算