关于Application.Lock和Lock(obj)
http://www.cnblogs.com/yeagen/archive/2012/03/01/2375610.html
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住的内容,所以写代码需要我们更认真。倒底是用哪个比较好,就看各位自己的实际需求了。
http://www.cnblogs.com/pcajax/archive/2009/08/19/1663235.html
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
有一个作为参数的对象,在该参数的后面还有一个一次只能由一个线程执行的代码块
参数必须为基于引用类型的对象 该对象用来定义锁的范围
在上例[private void Function(){lock(obj){}}]中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用
提供给 lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例
此对象通常表示需要进行线程同步的资源
eg:如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
最好避免锁定 public 类型或锁定不受应用程序控制的对象实例 如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致
死锁 [ 两个或更多个线程等待释放同一对象]
锁定公共数据类型(相比于对象)也可能导致问题
锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留,这意味着整个程序中任何给定字符串都只有一个实例
就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本
只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例
某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot
private static object syncCSListLock = new object();.
lock (syncTSLock)
lock(x)
{
DoSomething();
}
等价于
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
关于Application.Lock和Lock(obj)的更多相关文章
- 关于Application.Lock和Lock(obj) 转 http://www.cnblogs.com/yeagen/archive/2012/03/01/2375610.html
关于Application.Lock和Lock(obj) Posted on 2012-03-01 15:28 billpeng 阅读(3498) 评论(3) 编辑 收藏 1.Application. ...
- 为什么不要 "lock(this)" ? lock object 并是readonly(转载)
一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是 ...
- Lock的lock/unlock, condition的await/singal 和 Object的wait/notify 的区别
在使用Lock之前,我们都使用Object 的wait和notify实现同步的.举例来说,一个producer和consumer,consumer发现没有东西了,等待,produer生成东西了,唤醒. ...
- Python用上锁和解锁 lock lock.acquire lock.release 模拟抢火车票
Python用上锁和解锁 lock lock.acquire lock.release 模拟抢火车票 import jsonimport timefrom multiprocessing impor ...
- “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- [MySQL] gap lock/next-key lock浅析
当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将锁细分为如下几种子类型: record lock (RK) 记录锁, 仅仅锁住索引记录的一行 ...
- gap lock/next-key lock浅析 Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- gap lock/next-key lock浅析Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- C# 使用lock关键字lock不同的对象
c# lock关键字的本质 是调用Monitor.Enter(object obj)并且在finally的时候调用Monitor.Exit(obj) 在obj是不同数据类型的时候会出现不同的情况 1. ...
随机推荐
- jqGrid Tree
CSS: <!--jqGrid--><link rel="stylesheet" href="plugins/jqgird/css/ui.jqgrid. ...
- PHP的语言规范
PHP的语言规范: 1.php中的变量名区分大小写,但是函数名,类名,方法名,不区分大小写,但建议区分大小写 2.php代码必须书写在<?php?>(php标签),开启标记(<?ph ...
- IOCP模型总结(转)
IOCP模型总结(转) IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型.它是应用程序使用线程池处理异步I/O请求的一种机制.在处理多个并发的异步I/O请求 ...
- 在Java中弹出位于其他类的由WindowsBuilder创建的JFrameApplicationWIndow
我们一般在使用Java弹出窗体的时候,一般是使用Jdialog这个所谓的"对话框类".但是,如果你不是初学者或研究员,而会在使用Java进行swing项目的开发,那么你很可能用到一 ...
- jQuery scroll(滚动)延迟加载
延迟加载 $(window).scroll(function(){ var scrollHeight = $(document).height(); //文档高度 var scrollTop = $( ...
- Spark Tungsten揭秘 Day3 内存分配和管理内幕
Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...
- Python-Day1 Python基础学习
一.Python3.5.X安装 1.Windows Windows上找度娘搜索“Python for windows下载”就OK了,安装的时候可以勾选设置环境变量,也可以安装完手动设置,这样在cmd中 ...
- db2使用Java存储过程实现MD5函数
1.数据库版本 2.Java脚本 import java.security.MessageDigest; import COM.ibm.db2.app.UDF; public class MD5UDF ...
- Android SDK离线安装方法详解(加速安装) 转
AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助! 离线安装包下载地址:http://dl.vmall.com/c ...
- NodeJS包管理工具——npm入门
如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……当然还有Node.js的npm.有的人会奇怪为何要引入又一个新东西来让我 ...