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)的更多相关文章

  1. 关于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. ...

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

    一. 为什么要lock,lock了什么?   当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是 ...

  3. Lock的lock/unlock, condition的await/singal 和 Object的wait/notify 的区别

    在使用Lock之前,我们都使用Object 的wait和notify实现同步的.举例来说,一个producer和consumer,consumer发现没有东西了,等待,produer生成东西了,唤醒. ...

  4. Python用上锁和解锁 lock lock.acquire lock.release 模拟抢火车票

    Python用上锁和解锁  lock lock.acquire lock.release 模拟抢火车票 import jsonimport timefrom multiprocessing impor ...

  5. “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. [MySQL] gap lock/next-key lock浅析

    当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将锁细分为如下几种子类型: record lock (RK) 记录锁, 仅仅锁住索引记录的一行 ...

  7. gap lock/next-key lock浅析 Basic-Paxos协议日志同步应用

    http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...

  8. gap lock/next-key lock浅析Basic-Paxos协议日志同步应用

    http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...

  9. C# 使用lock关键字lock不同的对象

    c# lock关键字的本质 是调用Monitor.Enter(object obj)并且在finally的时候调用Monitor.Exit(obj) 在obj是不同数据类型的时候会出现不同的情况 1. ...

随机推荐

  1. c# 简单的通用基础字典

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Alif.Ali ...

  2. iOS 非ARC基本内存管理系列 2-多对象内存管理(1)

    单个对象的内存管理非常简单无非就是alloc对应release,retain对应release.但是如果涉及到很多对象,而且对象与对象有联系的时候该怎么去管理对象的内存呢. 比如同样一本书有好3个人购 ...

  3. JAVA MemCache 史无前例的详细讲解【转】

    非原创转自:http://nhy520.iteye.com/blog/1775893 这篇文章是我看到的介绍的比较详细的,入门级别算是足足够了 Memcach什么是Memcache Memcache集 ...

  4. aws linuxbrew GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2

    在 aws ec2 里面出现 segement fault,ls rm 等命令都不能正常运行,会出现: ls: relocation error: /home/ec2-user/.linuxbrew/ ...

  5. SQL Server中批量替换数据

    SQL Server数据库中批量替换数据的方法 SQL Server数据库操作中,我们可能会根据某写需要去批量替换数据,那么如何批量修改替换数据呢?本文我们就介绍这一部分内容,接下来就让我们一起来了解 ...

  6. iis7伪静态

    http://jingyan.baidu.com/article/67508eb4ff92c69cca1ce49a.html

  7. MySql 服务端与客户端下载地址

    mysql官网的注册,要上传户口,才能下载. 在网上搜了个下载地址. mysql-5.6.8-rc http://mysql.stu.edu.tw/Downloads/MySQL-5.6/mysql- ...

  8. 1. Linux驱动开发之开篇--Makefile

    基本Makefile假设现在有3个文件,file2.h是函数声明,file2.c是函数定义,文件file1.c调用file2.c中的函数.则Makefile文件的编写如下: helloworld:fi ...

  9. Arcgis 10.1 求面里面所包含的点的平均值

    空间链接的作用:将面上的所有点的值加起来取平均值。赋值给面属性。(我们可以定义右击——定义合并规则 连接要素的字段映射参数中指定的合并规则仅适用于连接要素中的属性,且仅适用于多个要素与目标要素匹配   ...

  10. 深层次详解Exception

    所有的异常类都继承自System.Exception类,当异常产生时,CLR将创建该异常类的实例对象,将从最底层依次寻找合适的异常类型,同时若存在catch语句时将会选择最合适的语句进行处理. cat ...