旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如:

public void ProcessTask(int taskid){ 
    lock(taskid){  .....   } 
}

编译说lock只能使用引用类型。有些人聪明(我想我以前也有这样的"聪明"。。),这样做: lock((object)taskid){...}

但是,实际的经验告诉我,这样行不通,lock需要的是引用,严格来说是需要对象的实例。

即使对象在意义上是相同的,但是如果不是ReferenceEquals的话,那么将作为两个实例来对待,那么C# lock 的就不是同一个东西。也就是说,当你以为这个 lock 生效的话,它其实在做无用工。

在上面的例子,由于lock((object)taskid)每执行一次,taskid都进行一次装箱,而装箱后的对象不是同一个实例(都是完完全全的新的实例),所以 lock((object)taskid){...} 是白做了。

当然,lock((object)123){} 这样的做法也是一样有问题的。

但是这种就好点:lock(“helloworld“){} 。为什么只是“好点”,而不是“没有问题”了呢。原因在于DotNet分配字符串的机制。DotNet为每个Assembly里的字符串都分配固定的空间。所以每次引用“helloworld“的时候,是同一个实例。但是这个字符串不会在其他Assembly中得到共用。如果几个Assembly都是这样写的,那么它们各自有她们自己的“helloworld“

比较好的做法:

lock(this)... 
lock(typeof(ThisType)) 
lock(GetType())//除非你明白这是干什么,否则不要乱来。 
lock(SomeType.StaticSyncObject) 
lock(someinst.SyncObject) 
其他的一些不好的做法

lock(“task:“+id) 
lock(filename) 
当然,具体lock什么东西,是设计上的协议和规范。不过要注意的是,使用lock必须明确对象是不是想象中的同一实例。

如果需要针对一个变化的值,从它的意义上的Equals方面进行 lock ,那怎么办? 
这个可以参考  http://www.lostinet.com/files/ 下的 HashCodeLock (里面很多细节可以优化)

C# 中的 lock的陷阱相关推荐

  1. 浅谈c#中使用lock的是与非

    1.从"最简单"的单例模式说起: publicclass Singleton { privatestatic Singleton instance =null; privatest ...

  2. C++中的Lock简单用法

    简单记录一下C++中的Lock的用法 下面是使用临界区进行线程同步 首先定义一个临界区对象 CCriticalSection m_CritSect; //临界对象,同步线程使用 在需要使用到可能起冲突 ...

  3. [译] 理解 NPM 5 中的 lock 文件

    本文讲的是[译] 理解 NPM 5 中的 lock 文件, 原文地址:Understanding lock files in NPM 5 原文作者:Jiří Pospíšil 译文出自:掘金翻译计划 ...

  4. NET面试题:C#中的lock关键字有何作用

    NET面试题:C#中的lock关键字有何作用 2011-03-01 08:42:04 标签:.net面试题 .net电子书 .net教学视频 .net 更多.net面试题,.net电子书,.net教学 ...

  5. lucene中write.lock索引锁机制的原理

    write.lock加锁的实现原理: 实现源码(lucene 6.0): @Override protected Lock obtainFSLock(FSDirectory dir, String l ...

  6. java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字

    Java并发 一.锁 1. 偏向锁 1. 思想背景 来源:HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁 ...

  7. java List.subList方法中的超级大陷阱

    java List.subList方法中的超级大陷阱 2012-06-26 10:13:18|  分类: java 基础知识 |  标签:java集合使用  java基础  |举报|字号 订阅 下载L ...

  8. Java中的Lock详解

    一.简介 java.util.concurrent.locks.Lock 是一个类似于synchronized 块的线程同步机制.但是 Lock比 synchronized 块更加灵活.Lock是个接 ...

  9. List中remove()方法的陷阱,被坑惨了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/pelifymeng2/ article/details/78085836 Java的List在删 ...

最新文章

  1. html5 popup,popup.js-jQuery和CSS3可互动的3D弹出窗口插件
  2. LIVE 预告 | 牛津胡庆拥:学习理解大规模点云
  3. 本地第一次对接已经存在的github上的repository
  4. Fansblog(HDU-6608)
  5. C++/OpenGL:图像指针操作
  6. 【英语学习】【Level 07】U06 First Time L3 Subway everyday
  7. 使用sync-request和cheerio写爬虫
  8. python输出字符_python输出字符
  9. java nio 2_Java NIO2:NIO概述
  10. 从省市级到区县级,Power BI topoJSON 中国行政区划地图都在这了
  11. VC2012编译protobuf出错处理
  12. MATLAB中使用XLSREAD无法找到文件的一种解决方法
  13. 机器学习算法初识—二分k均值算法
  14. 用Python爬取网易云音乐全部歌手信息(歌手id和歌手名字)
  15. kibana 7.5.1 + apm 7.5.1实现应用性能(apm)监控
  16. 鸿蒙太空是什么意思,我所居兮,青埂之峰:我所游兮,鸿蒙太空,谁与我逝兮,吾谁与从?渺渺茫茫兮归彼大荒!什么意思?求解...
  17. 安卓自动滑屏脚本_按键精灵自动滑屏脚本
  18. 亚马逊账号被关联能申诉得回来吗
  19. 从浪潮之巅到千里之行,区块链能否实现赢家通吃?
  20. 论Cardano修仙之路,聊ADA现状分析

热门文章

  1. 教你玩4款最新族视频摄像头
  2. 关于Spring中IOC容器和AOP协同工作的原理理解
  3. C#模拟HTTP POST 请求
  4. CODEVS——T 1049 棋盘染色
  5. Deep learning:五(regularized线性回归练习)
  6. Android 屏幕尺寸知识
  7. ios 使用UINavagationController时,push,pop方法执行的一些方法
  8. 主题:Centos6.4安装JDK
  9. 学习使用Bing Maps Silverlight Control(一):准备和新建
  10. Vuex State模块化