我有一個帶有所有資源的基本路徑的文件。例如:代碼會產生競爭狀態嗎?
build/scripts/script1.js
build/scripts/script2.js
我當然需要例如基本路徑:
https://example.org/SuperDuperSite/build/scripts/script1.js
什麼,我希望做的是將文件加載到一個全局字典在與路徑啓動。字典只需要加載一次。不幸的是,據我所知,基本路徑不可用,直到第一個請求。所以在asp.net我必須使用application_beginrequest
而不是application_start
。現在我不得不面對多線程問題。
這迫使我寫了下面的代碼類型:
lock(_lock) {
if (_dictionary == null) {
LoadDictionary();
}
}
這將要求每一個請求時,我才真正需要一次加載它。我當然不喜歡這個。出於性能原因,我不想鎖定每一個請求。一個解決方案,交談學院之後,我們想出了:
if (_dictionary == null)
{
lock(_lock) {
if (_dictionary == null) {
LoadDictionary();
}
}
}
這個解決方案,我不會被要求鎖定在每一個請求
左右,但如果多個線程最終獲得這部分在啓動時我會再保護它通過檢查對象是否在鎖內再次爲空。此代碼是否可以工作,還是會遇到競爭狀態?
聽起來很複雜,包括一個基地網址。您是否有理由在啓動時將它加載到字典中? –
你確定你是從正確的角度來攻擊嗎?有沒有理由不能做相對路徑請求? –
雙重檢查鎖定在c#中是安全的。代碼示例中的條件是落後的,但其他條件很好。 –