zoukankan      html  css  js  c++  java
  • 关于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和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住的内容,所以写代码需要我们更认真。倒底是用哪个比较好,就看各位自己的实际需求了。

  • 相关阅读:
    [原创]MYSQL的简单入门
    [原创]关于ORACLE的使用入门
    [原创]关于数据库优化
    [原创]MYSQL中利用外键实现级联删除和更新
    [原创]mybatis详解说明
    [原创]关于mybatis中一级缓存和二级缓存的简单介绍
    [原创]mybatis中整合ehcache缓存框架的使用
    maven添加仓库没有的jar包
    PHP源码安装
    MySQL远程登陆解决
  • 原文地址:https://www.cnblogs.com/mmbbflyer/p/6118217.html
Copyright © 2011-2022 走看看