1.Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码(注意不光锁住对于Application的赋值)。

2.Lock(obj) 于用锁住obj对象,obj对象必须是全局对象(如:Application)。

Application.Lock/UnLock的使用方法:

Application.Lock();
//其他代码
Application["value"] = 1;
//其他代码
Application.UnLock();

Lock(obj)的使用方法:

Lock(Application){
//其他代码
Application["value"] = 1;
//其他代码
}

以上两段代码的功能是一样的,都是锁住代码段让代码段内的代码不会被多线程同时执行。

它们两者之间也存在区别,来看一下它们的区别:

网站内任何一个网页执行Application.Lock的时候,整站中所有关于Application的操作都会被锁定延时执行。(包括:Application赋值和Application读取);而Lock(obj)则不会影响其他没有写Lock(obj)的页面。

例子:

先来看看Application.Lock的用法:

A页面:

Application.Lock();
Application["value"] = 1;
System.Threading.Thread.Sleep(10000);
Application.UnLock();

B页面:

object value = Applcation["value"];

我们先执行A页面,再执行B页面。由于Application在A页面中被锁定,所以B页面中需要获取Application中的值则需要等待A页面中执行完毕才行。

我们再来看一下Lock(obj)的用法:

A页面:

lock(Application)
{
Application["value"] = 1;
System.Threading.Thread.Sleep(10000);
}

B页面:

object value = Applcation["value"];
Applcation["value"] = 2;

我们同样先执行A页面,再执行B页面。你会发现A页面中Application虽然被锁定,但是由于在B页面并没有相应Lock代码,读取和修改都是成功的。

如果需要把B页面锁住,则需要把B页面的代码修改成:

lock(Application)//B页面里也要加入Lock
{
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)相关推荐

  1. 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: ...

  2. 转载 为什么不要 lock(this) ? lock object 并是readonly

    转载地址http://blog.csdn.net/gulijiang2008/article/details/7257422 一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的 ...

  3. 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 ...

  4. Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock

    Mysql INNODB引擎行锁的3种算法 InnoDB存储引擎有3种行锁的算法,其分别是: □ Record Lock:单个行记录上的锁 Record Lock总是会去锁住索引记录,如果InnoDB ...

  5. FLUSH TABLES WITH READ LOCK 和 LOCK TABLES

    今天在解决数据库同步异常的时候用到了flush tables with read lock 这个命令,于是顺便就学习了下锁表的相关知识. 1.FLUSH TABLES WITH READ LOCK 这 ...

  6. Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock

    Mysql 插入意向锁与自增锁备份锁日志锁 插入意向锁Insert Intention Lock 插入意向锁Insert intention locks是记录级别的,它通过"INSERT&q ...

  7. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock

    记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...

  8. lock.lock_HibernateCascadeType.LOCK陷阱

    lock.lock 介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 ,就该分析CascadeType.LOCK行为了. Hibernate锁定请求触发内部LockEve ...

  9. Lock的lock()方法

    ReentrantLock是JDK唯一实现了Lock接口的类 lock() 是平常使用得最多的一个方法,就是用来获取锁.如果锁已被其他线程获取,则进行等待. 由于在前面讲到如果采用Lock,必须主动去 ...

最新文章

  1. AI一分钟 | 知乎融资2.7亿美元;腾讯投资特斯拉大赚特赚
  2. 使用多个JFrame:好的还是不好的做法? [关闭]
  3. 5G NR — 频率、频段、载波、载频、载波带宽
  4. pom项目install报错没有自己_SAP财务凭证报错:没有项目种类分配到科目
  5. python异常处理_Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化...
  6. linux测试磁盘io脚本,脚本分享:Linux下磁盘io测试
  7. 如何在PowerPoint中自动调整图片大小
  8. 基于ConvLSTM的伦敦空气质量预测(1) 数据处理
  9. [论文阅读] Learning Without Forgetting
  10. 1031. 查验身份证(15)-PAT乙级真题
  11. Java记录 -4- 运算符 Operator
  12. 让Docker功能更强大的10个开源工具
  13. Linux下安装并启动MongoDB
  14. Dart教程(四):语法
  15. 国密 SM4 高并发服务 加压测服务 加生成秘钥 结合上篇一起使用 国密 SM2 SM3 SM4 后续升级版本,内容丰富单独写一篇百万压测4000毫秒加解密
  16. IT狂人第一至四季/全集The IT Crowd迅雷下载
  17. Android 闹钟详解
  18. 运用html画一个三角形,利用css或html5画出一个三角形的方法
  19. 解决Worker 1 failed executing transaction ‘ANONYMOUS‘ at master log mall-mysql-bin.000001, end_log_pos
  20. python字符串是有序的吗_Python之字符串

热门文章

  1. 触发器批量更新 用游标,一个一个处理
  2. ASP.NET 2.0 之 Master Page 学习笔记
  3. ES6模块与commonJS模块的差异
  4. input在iOS里的兼容性
  5. 是什么样的骚操作让应用上线节省90%的时间
  6. django-rest-framework第一次使用使用常见问题
  7. iOS底层原理探究-Runloop
  8. Spring Cloud Config服务端配置细节(一)
  9. TCP/IP TELNET SSH
  10. Unity 通过Unity Admob Plugin插件集成admob教程