关于Application.Lock和Lock(obj)
1.Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码(注意不光锁住对于Application的赋值)。
2.Lock(obj) 于用锁住obj对象,obj对象必须是全局对象(如:Application)。
Application.Lock/UnLock的使用方法:
//其他代码
Application["value"] = 1;
//其他代码
Application.UnLock();
Lock(obj)的使用方法:
//其他代码
Application["value"] = 1;
//其他代码
}
以上两段代码的功能是一样的,都是锁住代码段让代码段内的代码不会被多线程同时执行。
它们两者之间也存在区别,来看一下它们的区别:
网站内任何一个网页执行Application.Lock的时候,整站中所有关于Application的操作都会被锁定延时执行。(包括:Application赋值和Application读取);而Lock(obj)则不会影响其他没有写Lock(obj)的页面。
例子:
先来看看Application.Lock的用法:
A页面:
Application["value"] = 1;
System.Threading.Thread.Sleep(10000);
Application.UnLock();
B页面:
我们先执行A页面,再执行B页面。由于Application在A页面中被锁定,所以B页面中需要获取Application中的值则需要等待A页面中执行完毕才行。
我们再来看一下Lock(obj)的用法:
A页面:
{
Application["value"] = 1;
System.Threading.Thread.Sleep(10000);
}
B页面:
Applcation["value"] = 2;
我们同样先执行A页面,再执行B页面。你会发现A页面中Application虽然被锁定,但是由于在B页面并没有相应Lock代码,读取和修改都是成功的。
如果需要把B页面锁住,则需要把B页面的代码修改成:
{
object value = Applcation["value"];
Applcation["value"] = 2;
}
另外:Application和Lock(Application)虽然都可以锁定Application,但不能互相锁定,即:在A页面中用Application.Lock/UnLock,在B页面中用Lock(Application),这样B页面是锁定不了的,当然如果B页面中本身就包含了对Application的读取和赋值,那么B页面也会被锁,原因是上面已经提到了。
由此可见:Application.Lock/UnLock比较安全,因为它是全局锁定所有的Application的,而Lock(obj)则更灵活,因为另一页面中如果没有写Lock(obj)则可以修改其他页面Lock住的内容,所以写代码需要我们更认真。倒底是用哪个比较好,就看各位自己的实际需求了。
转载于:https://www.cnblogs.com/lxboy2009/p/5579656.html
关于Application.Lock和Lock(obj)相关推荐
- 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: ...
- 转载 为什么不要 lock(this) ? lock object 并是readonly
转载地址http://blog.csdn.net/gulijiang2008/article/details/7257422 一. 为什么要lock,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 ...
- FLUSH TABLES WITH READ LOCK 和 LOCK TABLES
今天在解决数据库同步异常的时候用到了flush tables with read lock 这个命令,于是顺便就学习了下锁表的相关知识. 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 ...
- lock.lock_HibernateCascadeType.LOCK陷阱
lock.lock 介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 ,就该分析CascadeType.LOCK行为了. Hibernate锁定请求触发内部LockEve ...
- Lock的lock()方法
ReentrantLock是JDK唯一实现了Lock接口的类 lock() 是平常使用得最多的一个方法,就是用来获取锁.如果锁已被其他线程获取,则进行等待. 由于在前面讲到如果采用Lock,必须主动去 ...
最新文章
- AI一分钟 | 知乎融资2.7亿美元;腾讯投资特斯拉大赚特赚
- 使用多个JFrame:好的还是不好的做法? [关闭]
- 5G NR — 频率、频段、载波、载频、载波带宽
- pom项目install报错没有自己_SAP财务凭证报错:没有项目种类分配到科目
- python异常处理_Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化...
- linux测试磁盘io脚本,脚本分享:Linux下磁盘io测试
- 如何在PowerPoint中自动调整图片大小
- 基于ConvLSTM的伦敦空气质量预测(1) 数据处理
- [论文阅读] Learning Without Forgetting
- 1031. 查验身份证(15)-PAT乙级真题
- Java记录 -4- 运算符 Operator
- 让Docker功能更强大的10个开源工具
- Linux下安装并启动MongoDB
- Dart教程(四):语法
- 国密 SM4 高并发服务 加压测服务 加生成秘钥 结合上篇一起使用 国密 SM2 SM3 SM4 后续升级版本,内容丰富单独写一篇百万压测4000毫秒加解密
- IT狂人第一至四季/全集The IT Crowd迅雷下载
- Android 闹钟详解
- 运用html画一个三角形,利用css或html5画出一个三角形的方法
- 解决Worker 1 failed executing transaction ‘ANONYMOUS‘ at master log mall-mysql-bin.000001, end_log_pos
- python字符串是有序的吗_Python之字符串