尋找錯誤時,我遇到了Spring 3.0.5源代碼DelegatingFilterProxy
,我不知道它是否存在性能瓶頸。Spring DelegatingFilterProxy多線程問題
鑑於每個Web應用程序只有一個DelegatingFilterProxy的實例(每<filter>
聲明,當然)我必須假設,在高負載下了很多的工作線程試圖調用並行doFilter()
方法。
現在看看代碼:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// Lazily initialize the delegate if necessary.
Filter delegateToUse = null;
synchronized (this.delegateMonitor) {
if (this.delegate == null) {
WebApplicationContext wac = findWebApplicationContext();
if (wac == null) {
throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?");
}
this.delegate = initDelegate(wac);
}
delegateToUse = this.delegate;
}
// Let the delegate perform the actual doFilter operation.
invokeDelegate(delegateToUse, request, response, filterChain);
}
的synchronized (this.delegateMonitor)
塊必須由所有線程傳遞,這意味着所有的工人被迫耐心地排隊,直到他們被允許進入。
不管爲什麼要在這裏完成所需的bean查找我懷疑使用本來是可以避免利於並行執行的 - 可以是僅在查找的情況下,使this.delegate
揮發性和使用同步需要做的。
所以,我吠叫錯了樹?任何輸入讚賞。
我沒有這樣做呢。隨意這樣做。關於性能的影響,我記得我心愛的Java實踐中的「Java Concurrency」一書中說,掛起和重新激活線程在時鐘週期中與對象分配等相比是巨大的。同樣看着像AtomicLong或ConcurrentHashMap這樣的類,它們儘可能地避免了同步塊,這給了我相同的方向。 – user1085804