在經典ASP有一個全局對象,稱爲「應用程序」,它是由所有會話simultaniously訪問。經典ASP:「應用程序」全局對象可以導致死鎖嗎?
由於「應用程序」對象是共享資源,它是否會導致死鎖?
編輯:如果不是,爲什麼它鎖定和解鎖方法? Reference
在經典ASP有一個全局對象,稱爲「應用程序」,它是由所有會話simultaniously訪問。經典ASP:「應用程序」全局對象可以導致死鎖嗎?
由於「應用程序」對象是共享資源,它是否會導致死鎖?
編輯:如果不是,爲什麼它鎖定和解鎖方法? Reference
死鎖與正常阻止不同。由於頁面是在不同的線程中處理的,因此如果要防止其他請求修改該共享資源,則使用Lock,並且要再次進行修改,請使用Unlock方法。問題是,如果您不使用這些方法,另一個請求可以更改應用程序狀態中某個項目的值,而您依賴的是舊值。或者兩個請求可以嘗試同時修改它,並且可能會導致問題。 Lock方法會導致請求等待,直到其他請求解鎖應用程序;之後,它可以繼續。
死鎖是其中線程A鎖資源1個和等待爲資源2變得可用的情況。與此同時線程B,這鎖定資源2只需要訪問資源1(由線程A鎖定)繼續工作,並能夠在事後釋放資源。在這種情況下,無的線程可以繼續(其中一個必須終止以允許繼續)。這是一個死鎖。如果正確使用,Application.Lock本身不會造成死鎖。但是,如果使用不當,可能會導致死鎖(當與另一個需要鎖定的共享資源結合使用時,並且不會考慮死鎖)。
不,它從不阻止。
死鎖是一種情況,其中兩個或更多競爭行爲正在等待另一個完成,因此從來沒有這樣做。
鎖定ASP Application
對象不太可能導致持續時間超過服務器腳本超時設置的死鎖。
傳統的ASP Application
對象具有鎖定和解鎖,用於同步對應用程序對象的更改。您可以有多個請求嘗試對相同的值進行更改 - 不鎖定,更改並解鎖更改可能會丟失。
就像一個簡單的例子就是某種計數器。比方說,你的代碼做:
<%
Application("Count") = Application("Count") + 1
%>
如果你有兩個同時請求(REQ1和REQ2),你可以「丟失」分頁命中 - 實際上是一個「缺少更新」。
可以防止這種通過更新,並在更新後解鎖它之前鎖定Application
變量:
<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>
如果Application
而另一個請求線程試圖訪問被鎖定,該線程將被阻塞,直到鎖被釋放或超出腳本超時。
如果您忘記解鎖一個鎖,它將在頁面處理後或超過腳本超時後自動釋放。
欲瞭解更多信息,see MSDN。