爲了增加Ben Doom所說的關於Java的內容,這在ColdFusion中是相當標準的做法,特別是在設置應用程序變量的應用程序初始化例程中。
如果沒有至少一個鎖,那麼您讓初始匹配到您的Web應用程序都會同時初始化應用程序變量。這假設您的應用程序足夠忙,以保證這一點。如果您的應用程序在您的應用程序首次啓動時處於繁忙狀態,則危險僅限於此。
第一個鎖確保一次只有一個請求初始化您的變量。
嵌入在第一個鎖中的第二個鎖將檢查以確保存在初始化代碼末尾定義的變量,例如application.started。如果存在,用戶將被踢出。
雙鎖定模式已將我的皮膚保存在繁忙的站點上,但是,對於非常繁忙的站點,應用程序初始命中完成請求的隊列可能會過快,過快,並導致服務器崩潰。這個想法是,這些請求正在等待第一個命中,這是緩慢的,然後第二個中斷到第一個cflock,並很快被拒絕。隨着隊列中的數百或數千個請求,每毫秒都在增長,它們都彙集到第一個cflock塊。解決方案是在第一個cflock上設置一個非常低的超時時間,而不是拋出(或捕捉並且鴨子)鎖超時錯誤。
最後,我描述的這種行爲已經被Application.cfc的ColdFusion 7的onApplicationStart()方法所棄用。如果你正在使用onApplicationStart(),那麼你不應該爲你的應用程序init例程鎖定。 Application.cfc已被鎖定。
總而言之,是的,雙重檢查鎖定在ColdFusion中起作用。這在某些情況下很有幫助,但是要正確。我不知道爲什麼它的工作原理與Java的線程模型不同,可能是在ColdFusion服務器的後臺手動檢查某種查找表。
事實上,我認爲他們是必要的,以防止內森描述的競爭條件。 – 2009-02-18 16:58:18
@丹·羅伯茨:這就是我所說的。 – 2009-02-20 16:46:11