关于Application.Lock和Lock(obj)
1.Application.Lock和Application.UnLock一般配對(duì)出現(xiàn),用于鎖住Lock與UnLock之間的所有代碼(注意不光鎖住對(duì)于Application的賦值)。
2.Lock(obj) 于用鎖住obj對(duì)象,obj對(duì)象必須是全局對(duì)象(如:Application)。
Application.Lock/UnLock的使用方法:
Application.Lock();//其他代碼
Application["value"]?=?1;
//其他代碼
Application.UnLock();
?Lock(obj)的使用方法:
Lock(Application){//其他代碼
Application["value"]?=?1;
//其他代碼
}
以上兩段代碼的功能是一樣的,都是鎖住代碼段讓代碼段內(nèi)的代碼不會(huì)被多線程同時(shí)執(zhí)行。
它們兩者之間也存在區(qū)別,來(lái)看一下它們的區(qū)別:
網(wǎng)站內(nèi)任何一個(gè)網(wǎng)頁(yè)執(zhí)行Application.Lock的時(shí)候,整站中所有關(guān)于Application的操作都會(huì)被鎖定延時(shí)執(zhí)行。(包括:Application賦值和Application讀取);而Lock(obj)則不會(huì)影響其他沒(méi)有寫(xiě)Lock(obj)的頁(yè)面。
例子:
先來(lái)看看Application.Lock的用法:
?A頁(yè)面:
Application.Lock();Application["value"]?=?1;
System.Threading.Thread.Sleep(10000);
Application.UnLock();
?B頁(yè)面:
object?value?=?Applcation["value"];我們先執(zhí)行A頁(yè)面,再執(zhí)行B頁(yè)面。由于Application在A頁(yè)面中被鎖定,所以B頁(yè)面中需要獲取Application中的值則需要等待A頁(yè)面中執(zhí)行完畢才行。
我們?cè)賮?lái)看一下Lock(obj)的用法:
A頁(yè)面:?
lock(Application){
Application["value"]?=?1;
System.Threading.Thread.Sleep(10000);
}
B頁(yè)面:
object?value?=?Applcation["value"];Applcation["value"]?=?2;
我們同樣先執(zhí)行A頁(yè)面,再執(zhí)行B頁(yè)面。你會(huì)發(fā)現(xiàn)A頁(yè)面中Application雖然被鎖定,但是由于在B頁(yè)面并沒(méi)有相應(yīng)Lock代碼,讀取和修改都是成功的。
如果需要把B頁(yè)面鎖住,則需要把B頁(yè)面的代碼修改成:
lock(Application)//B頁(yè)面里也要加入Lock{
object?value?=?Applcation["value"];
Applcation["value"]?=?2;
}
?
另外:Application和Lock(Application)雖然都可以鎖定Application,但不能互相鎖定,即:在A頁(yè)面中用Application.Lock/UnLock,在B頁(yè)面中用Lock(Application),這樣B頁(yè)面是鎖定不了的,當(dāng)然如果B頁(yè)面中本身就包含了對(duì)Application的讀取和賦值,那么B頁(yè)面也會(huì)被鎖,原因是上面已經(jīng)提到了。
由此可見(jiàn):Application.Lock/UnLock比較安全,因?yàn)樗侨宙i定所有的Application的,而Lock(obj)則更靈活,因?yàn)榱硪豁?yè)面中如果沒(méi)有寫(xiě)Lock(obj)則可以修改其他頁(yè)面Lock住的內(nèi)容,所以寫(xiě)代碼需要我們更認(rèn)真。倒底是用哪個(gè)比較好,就看各位自己的實(shí)際需求了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lxboy2009/p/5579656.html
總結(jié)
以上是生活随笔為你收集整理的关于Application.Lock和Lock(obj)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL从5.5升级到5.6,TIME
- 下一篇: VMware里装XP 没有找到硬盘驱动器