探究c# lock
今天早上阅读前辈的代码,看到了这么一段代码,如下所示:
lock("Execute")
{
string sqlStr = sbSQLScript.ToString();
}
看到第一句,我就怀疑了,c#当中的lock可以这么用吗?这是个什么用法,我第一次看到。我百度了下相关的技术资料。lock 一个引用类型,这没啥问题。问题是这个对象是个字符串。字符串在公共运行时clr中暂留,这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。
这一句话,来源于网络上别人的文章,需要验证,看是不是相同的字符串表示同一个对象?
static void Main(string[] args)
{
string a = "wbq";
string b = "wbq";
if (a == b && a.Equals(b) && object.ReferenceEquals(a,b))
{
Console.WriteLine("i am wbq,i am testing lock");
}
}
运行结果:

那是不是字符串内容相同了,就一定是同一个对象呢?
static void Main(string[] args)
{
string a = "wbq";
string b = "w";
b += "bq"; if (a == b)
{
Console.WriteLine("我们的值相同"); if (object.ReferenceEquals(a, b))
{ Console.WriteLine("i am wbq,i am testing lock");
}
else
{
Console.WriteLine("但是我们是两个不同的对象");
}
}
}
运行结果:

看到这个结果,是不是一开始很吃惊呢?是的,刚开始的时候,是很吃惊。后来想到,不是前辈教导我们:如果拼接大量的字符串会影响性能,改用StringBuilder吗?刚才的程序演示,果然揭示了这一真理,拼接字符串会产生新的对象,所以如果大量拼接,则会产生大量对象,对象多了,事情就多了。垃圾回收器GC可就忙了,它太忙,势必影响我们程序的性能。另外一方面,内存资源消耗的多了。有人说了,现在的电脑硬件很好什么的,这个不用操心,我就想说,内存还是比较稀缺的资源。水涨船高嘛,内存大了,如今的程序胃口也大开,占用的内存也多了。
好了,言归正传,我们今天研究的主题是lock,不是string。
据说lock是个语法糖,它的真面目是 monitor.enter 结构,这个要怎么看才能知道呢?下面是代码:
class MainApp
{
class Program
{
private static readonly object lock4 = new object();
static void Main(string[] args)
{ lock (lock4)
{
Console.WriteLine("i am wbq,i am testing lock");
} Console.Read();
}
}
通过查看IL代码,可以看到:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 57 (0x39)
.maxstack
.locals init (bool V_0,
object V_1,
bool V_2)
IL_0000: nop
IL_0001: ldc.i4.
IL_0002: stloc.
.try
{
IL_0003: ldsfld object ConsoleApplication1.MainApp/Program::lock4
IL_0008: dup
IL_0009: stloc.
IL_000a: ldloca.s V_0
IL_000c: call void [mscorlib]System.Threading.Monitor::Enter(object,
bool&)
IL_0011: nop
IL_0012: nop
IL_0013: ldstr "i am wbq,i am testing lock"
IL_0018: call void [mscorlib]System.Console::WriteLine(string)
IL_001d: nop
IL_001e: nop
IL_001f: leave.s IL_0031
} // end .try
finally
{
IL_0021: ldloc.
IL_0022: ldc.i4.
IL_0023: ceq
IL_0025: stloc.
IL_0026: ldloc.
IL_0027: brtrue.s IL_0030
IL_0029: ldloc.
IL_002a: call void [mscorlib]System.Threading.Monitor::Exit(object)
IL_002f: nop
IL_0030: endfinally
} // end handler
IL_0031: nop
IL_0032: call int32 [mscorlib]System.Console::Read()
IL_0037: pop
IL_0038: ret
} // end of method Program::Main
第18行 Threading.Monitor::Enter,第37行 System.Threading.Monitor::Exit,关于IL代码的一些语法规则,我打算另外阐述。
探究c# lock的更多相关文章
- ReentrantLock实现原理深入探究
前言 这篇文章被归到Java基础分类中,其实真的一点都不基础.网上写ReentrantLock的使用.ReentrantLock和synchronized的区别的文章很多,研究ReentrantLoc ...
- zookeeper使用和原理探究(一)
zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<The Chubby lock serv ...
- Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...
- 探究Android SQLite3多线程
最近做项目时在多线程读写数据库时抛出了异常,这自然是我对SQlite3有理解不到位的地方,所以事后仔细探究了一番. 关于getWriteableDataBase()和getReadableDataba ...
- Key lock 的秘密
研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了: Exec sp_lock: 就说上面的key ...
- Oracle undo 镜像数据探究
Oracle undo 镜像数据探究 今天是2013-08-18,隔别一周的 ...
- 【眼见为实】自己动手实践理解REPEATABLE READ && Next-Key Lock
首先设置数据库隔离级别为可重复读(REPEATABLE READ): set global transaction isolation level REPEATABLE READ ; set sess ...
- Runtime - ③ - 分类Category探究
写博客只是为了让自己学的更深刻,参考:https://tech.meituan.com/DiveIntoCategory.html 分类(Category)是个啥玩意儿这里就不多介绍了,这里主要是研究 ...
- 详解synchronized与Lock的区别与使用
知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...
随机推荐
- [CJOJ2410]数列操作d
[CJOJ2410]数列操作d 标签: 线段树 题解 没时间写题了,我来嘴巴AC吧. 注意区间加的这个值不是 确定的,随着元素位置的变化而改变. 只需要能维护这个东西剩下的就很好做了. 那么\(x*( ...
- 【Unity3D技术文档翻译】第1.0篇 AssetBundles
前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...
- C/C++语言简介之语言组成
一.数据类型 C的数据类型包括:整型.字符型.实型或浮点型(单精度和双精度).枚举类型.数组类型.结构体类型.共用体类型.指针类型和空类型. 二.常量与变量 常量其值不可改变,符号常量名通常用大写. ...
- CentOS 6安装Oracle报错解决方案
1. Preparing to launch Oracle Universal Installer from /tmp/OraInstall2017-05-23_04-18-48AM. Please ...
- ios音乐播放器demo
闲暇时间,写了一个音乐播放器. 个人认为,基于Demo 的学习是最有效果的. 想学习的同学,欢迎下载.知识,只有在传播的时候才有价值. 不懂之处,欢迎留言询问,将热情解答. 运行图 项目结构图 Git ...
- python>oop
oop即Object Oriented programming,面向对象编程 何为编程:特定的语法+数据结构+算法 编程范式就是从经验中总结的套路: 面向过程编程 适用于简单的脚本,一次任务是极好的, ...
- Mysql group by,order by,dinstict优化
1.order by优化 2.group by优化 3.Dinstinct 优化 1.order by优化 实现方式: 1. 根据索引字段排序,利用索引取出的数据已经是排好序的,直接返回给客户端: 2 ...
- linux 运维,代理,acl控制访问
运维概述:运行 & 维护,Operation & MaintanceIT运维.业务运维.日常管理运维采用相关的方法.手段.技术.制度.流程和文档等,对IT运行环境.IT业务系统和IT运 ...
- 微信 Tinker 的一切都在这里,包括源码
最近半年以来,Android热补丁技术热潮继续爆发,各大公司相继推出自己的开源框架.Tinker在最近也顺利完成了公司的审核,并非常荣幸的成为github.com/Tencent上第一个正式公开的项目 ...
- Java求素数时出现错误
Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...