C# 中的 lock的陷阱
旧事重提了,或许很多人会奇怪,为什么 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的陷阱相关推荐
- 浅谈c#中使用lock的是与非
1.从"最简单"的单例模式说起: publicclass Singleton { privatestatic Singleton instance =null; privatest ...
- C++中的Lock简单用法
简单记录一下C++中的Lock的用法 下面是使用临界区进行线程同步 首先定义一个临界区对象 CCriticalSection m_CritSect; //临界对象,同步线程使用 在需要使用到可能起冲突 ...
- [译] 理解 NPM 5 中的 lock 文件
本文讲的是[译] 理解 NPM 5 中的 lock 文件, 原文地址:Understanding lock files in NPM 5 原文作者:Jiří Pospíšil 译文出自:掘金翻译计划 ...
- NET面试题:C#中的lock关键字有何作用
NET面试题:C#中的lock关键字有何作用 2011-03-01 08:42:04 标签:.net面试题 .net电子书 .net教学视频 .net 更多.net面试题,.net电子书,.net教学 ...
- lucene中write.lock索引锁机制的原理
write.lock加锁的实现原理: 实现源码(lucene 6.0): @Override protected Lock obtainFSLock(FSDirectory dir, String l ...
- java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字
Java并发 一.锁 1. 偏向锁 1. 思想背景 来源:HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁 ...
- java List.subList方法中的超级大陷阱
java List.subList方法中的超级大陷阱 2012-06-26 10:13:18| 分类: java 基础知识 | 标签:java集合使用 java基础 |举报|字号 订阅 下载L ...
- Java中的Lock详解
一.简介 java.util.concurrent.locks.Lock 是一个类似于synchronized 块的线程同步机制.但是 Lock比 synchronized 块更加灵活.Lock是个接 ...
- List中remove()方法的陷阱,被坑惨了!
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/pelifymeng2/ article/details/78085836 Java的List在删 ...
最新文章
- html5 popup,popup.js-jQuery和CSS3可互动的3D弹出窗口插件
- LIVE 预告 | 牛津胡庆拥:学习理解大规模点云
- 本地第一次对接已经存在的github上的repository
- Fansblog(HDU-6608)
- C++/OpenGL:图像指针操作
- 【英语学习】【Level 07】U06 First Time L3 Subway everyday
- 使用sync-request和cheerio写爬虫
- python输出字符_python输出字符
- java nio 2_Java NIO2:NIO概述
- 从省市级到区县级,Power BI topoJSON 中国行政区划地图都在这了
- VC2012编译protobuf出错处理
- MATLAB中使用XLSREAD无法找到文件的一种解决方法
- 机器学习算法初识—二分k均值算法
- 用Python爬取网易云音乐全部歌手信息(歌手id和歌手名字)
- kibana 7.5.1 + apm 7.5.1实现应用性能(apm)监控
- 鸿蒙太空是什么意思,我所居兮,青埂之峰:我所游兮,鸿蒙太空,谁与我逝兮,吾谁与从?渺渺茫茫兮归彼大荒!什么意思?求解...
- 安卓自动滑屏脚本_按键精灵自动滑屏脚本
- 亚马逊账号被关联能申诉得回来吗
- 从浪潮之巅到千里之行,区块链能否实现赢家通吃?
- 论Cardano修仙之路,聊ADA现状分析