转载 为什么不要 lock(this) ? lock object 并是readonly
转载地址http://blog.csdn.net/gulijiang2008/article/details/7257422
一. 为什么要lock,lock了什么?
二. lock(this)怎么了?
using System;
using System.Threading;
namespace Namespace1
{
class C1
{
privatebool deadlocked= true;
//这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
publicvoid LockMe(object o)
{
lock (this)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :(");
Thread.Sleep(500);
}
}
}
//所有线程都可以同时访问的方法
publicvoid DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
class Program
{
staticvoid Main(string[] args)
{
C1 c1 =new C1();
//在t1线程中调用LockMe,并将deadlock设为true(将出现死锁)
Thread t1= new Thread(c1.LockMe);
t1.Start(true);
Thread.Sleep(100);
//在主线程中lock c1
lock (c1)
{
//调用没有被lock的方法
c1.DoNotLockMe();
//调用被lock的方法,并试图将deadlock解除
c1.LockMe(false);
}
}
}
class C1
{
privatebool deadlocked= true;
privateobject locker= newobject();
//这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
publicvoid LockMe(object o)
{
lock (locker)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :(");
Thread.Sleep(500);
}
}
}
//所有线程都可以同时访问的方法
publicvoid DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
而对于Monitor,发现它的静态方法Enter(object obj)有一个异常类型ArgumentNullException,
执行lock(null对象 )处,抛出未处理的异常:System.ArgumentNullException: 值不能为空!
在代码段中修改锁定对象,会出现 blance<0的情况,并会抛出异常
private static readonly object obj = new object();
为什么要设置成只读的呢?这是因为如果在lock代码段中改变obj的值,其它线程就畅通无阻了,因为互斥锁的对象变了,object.ReferenceEquals必然返回false。
所以把上面的修改成private static readonly
转载于:https://www.cnblogs.com/juefeiye/archive/2013/05/01/lock_this_lock_object.html
转载 为什么不要 lock(this) ? lock object 并是readonly相关推荐
- mysql MDL锁如何解决_MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析
一.前言 MYSQL中MDL锁一直是一个比较让人比较头疼的问题,我们谈起锁一般更加倾向于INNODB下层的gap lock.next key lock.row lock等,因为它很好理解,也很好观察, ...
- OpenWrt——Could not lock /var/lock/opkg.lock: Resource temporarily unavailable.
问题描述 root@OpenWrt:~# opkg update Collected errors:* opkg_conf_load: Could not lock /var/lock/opkg.lo ...
- Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
Mysql INNODB引擎行锁的3种算法 InnoDB存储引擎有3种行锁的算法,其分别是: □ Record Lock:单个行记录上的锁 Record Lock总是会去锁住索引记录,如果InnoDB ...
- Dumping all threads without appropriate locks held: thread list lock mutator lock报错原因?
以下报错是什么原因呢?跟了很久的代码,也没有找到具体原因 2021-07-16 16:30:15 07-16 16:30:15.825 11812 13216 I HwAudioRecordImpl: ...
- 关于Application.Lock和Lock(obj)
1.Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码(注意不光锁住对于Application的赋值). 2.Lock(o ...
- FLUSH TABLES WITH READ LOCK 和 LOCK TABLES
今天在解决数据库同步异常的时候用到了flush tables with read lock 这个命令,于是顺便就学习了下锁表的相关知识. 1.FLUSH TABLES WITH READ LOCK 这 ...
- FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
1.FLUSH TABLES WITH READ LOCK 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行.解 ...
- Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock
Mysql 插入意向锁与自增锁备份锁日志锁 插入意向锁Insert Intention Lock 插入意向锁Insert intention locks是记录级别的,它通过"INSERT&q ...
- Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...
最新文章
- 使用httpClient发送get\post请求
- Silverlight2 边学边练 之三 小球自由落体
- Jmeter将JDBC Request查询结果作为下一个接口参数方法
- 无电池摄像头如何实现高清晰度视频编码?
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 18丨即时食物配送 I【难度简单】​
- Postman接口压力测试
- html页面可以用在webview,使用WebView加载HTML代码
- 使用Scipy进行函数优化
- Lighttpd 启用 HTTPS 并重定向 HTTP 为 HTTPS 访问配置
- Task 4 用户输入->知识库的查询语句
- Qt多人协作项目执行方案
- 第一课 语言的发展史
- IRQL-NOT-LESS-OR-EQUAL异常分析
- 【转】大学四年因为知道了这32个网站,我成了别人眼中的大神!
- Java语言查询附近店铺算法
- python绘制并列的条形图的方法_python matplotlib库绘制条形图练习题
- 文件系统——空闲块成组链接法的模拟
- 克服反爬虫机制爬取智联招聘网站
- 使用EDI与SAP集成的解决方案
- 3dsMax模型转UE4