2008-11-24 64 views

回答

5

死鎖與正常阻止不同。由於頁面是在不同的線程中處理的,因此如果要防止其他請求修改該共享資源,則使用Lock,並且要再次進行修改,請使用Unlock方法。問題是,如果您不使用這些方法,另一個請求可以更改應用程序狀態中某個項目的值,而您依賴的是舊值。或者兩個請求可以嘗試同時修改它,並且可能會導致問題。 Lock方法會導致請求等待,直到其他請求解鎖應用程序;之後,它可以繼續。

死鎖是其中線程A資源1​​個等待資源2變得可用的情況。與此同時線程B,這鎖定資源2只需要訪問資源1​​(由線程A鎖定)繼續工作,並能夠在事後釋放資源。在這種情況下,的線程可以繼續(其中一個必須終止以允許繼續)。這是一個死鎖。如果正確使用,Application.Lock本身不會造成死鎖。但是,如果使用不當,可能會導致死鎖(當與另一個需要鎖定的共享資源結合使用時,並且不會考慮死鎖)。

0

不,它從不阻止。

0

死鎖是一種情況,其中兩個或更多競爭行爲正在等待另一個完成,因此從來沒有這樣做。

2

鎖定ASP Application對象不太可能導致持續時間超過服務器腳本超時設置的死鎖。

傳統的ASP Application對象具有鎖定和解鎖,用於同步對應用程序對象的更改。您可以有多個請求嘗試對相同的值進行更改 - 不鎖定,更改並解鎖更改可能會丟失。

就像一個簡單的例子就是某種計數器。比方說,你的代碼做:

<% 
Application("Count") = Application("Count") + 1 
%> 

如果你有兩個同時請求(REQ1和REQ2),你可以「丟失」分頁命中 - 實際上是一個「缺少更新」。

可以防止這種通過更新,並在更新後解鎖它之前鎖定Application變量:

<% 
Application.Lock 
Application("Count") = Application("Count") + 1 
Application.Unlock 
%> 

如果Application而另一個請求線程試圖訪問被鎖定,該線程將被阻塞,直到鎖被釋放或超出腳本超時。

如果您忘記解鎖一個鎖,它將在頁面處理後或超過腳本超時後自動釋放。

欲瞭解更多信息,see MSDN