2011-04-22 67 views
1

的工作如果在發言權的支柱ActionServletservice()方法例如​​塊,多個請求/線程將如何工作,如果是具有大量命中一個繁忙的網站。的ActionServlet - synchronized塊 - 線程

將每個線程等待下一次另外一個從synchronized塊釋放鎖?將在響應

+2

這個問題背後的理由是什麼?你有線程安全問題嗎? – BalusC 2011-04-22 20:27:11

回答

5

創建延遲不同步一個servlet的服務方法。

如果你同步一個servlet的service方法,實際上你爲Servlet的這個實例一次爲一個線程做一個「預留訪問」。

Struts ActionServlet等級是HttpServlet並且基本上doGetdoPost方法在這裏是感興趣的。如果我們要談論Struts,那麼process方法是主要的入口點,但同樣的原則適用於所有方法,就像它對於一般的service方法一樣。

想法是這樣的。

在聲明中你web.app,servlet容器(如Tomcat)的一個servlet將創建只有一個的servlet實例。這意味着只有一個實例服務於所有請求

如果有更多的請求在同一時間到達,每個請求線程都有機會在service方法中執行,因爲沒有執行同步。

如果你有10級請求的線程,每個將同時在service方法執行。這通常是安全的,因爲在service方法中完成的處理不涉及與它正在處理的當前請求有關的任何狀態。如果向servlet添加狀態,則會遇到問題。 Here is an article with more details on the subject

現在回到Struts的

Struts使用一種稱爲與ActionServlet一個Front Controller在於控制器圖案。這將依次將特定請求委託給其配置(a.k.a struts-config.xml)中指定的特定Action類。

所有傳入的請求都會通過此處。如果在此時進行同步(Struts process方法或servlet service方法更高),則一次爲線程保留一個servlet。 在struts的情況下,您保留了對時間爲的單個線程的請求的所有處理。

這意味着如果10個請求同時到達,在沒有同步的情況下所有可以並排執行,而在同步請求2的情況下必須等待,直到請求1完成,3等待2等等(即請求被順序處理)。這意味着糟糕的表現。

也許對於發出請求1的幸運用戶不會有任何性能影響,但是數字10將不得不等待。那麼數字100呢? 200?

如果您在編寫應用程序時考慮到線程安全性,則不需要同步入口點。如果您的應用程序屬於您無法避免同步的類型,那麼同步入口點將會降低性能。

P.S.還有一件事。如果您正在考慮將流程中的同步更低,即Action類,請注意它們也不是線程安全的,並且存在only one instance of it inside the Struts framework

+1

是真實的,但它太冗長了答案。我建議在上面放置一條最重要的規則:不要同步servlet方法。 – Bozho 2011-04-22 20:40:37

+0

@Bozho:很好的建議。謝謝! – 2011-04-23 15:09:36