2014-07-09 76 views
0

可能是您聽過的最愚蠢的問題。Web容器內部同一類的多於一個對象正在創建/管理,其中具有相同的參考變量

在Web容器中,同一類的多於一個對象正在被創建/管理,它具有相同的引用變量......讓我用一個例子來解釋。

裏面我的控制器類我有一個碼片

ADMINUSER ADMINUSER =新ADMINUSER();

所以當2升管理員的跡象,在我的web應用程序,就會出現類ADMINUSER了相同的變量「ADMINUSER」

  1. 如何可能的2個對象,是2級不同的線程?
  2. 誰在管理這個線程,Web容器?
  3. 如果是這樣,web容器如何做,它是否包裝應用程序 代碼與threadLocal?
  4. 如果它的線程不同,爲了維護一個全局對象(比如管理訪問次數爲 ),「static」就不足以了......它需要是 「volatile」,而不是正確的?
+0

答案取決於你的控制器類如何被實例化。 – Eran

回答

0

這是我一直在尋找的答案。感謝所有回答的人。

Does application server create new thread for each request from same user?

Web容器(Tomcat)的派生新的線程爲每個請求(不是真的,它使用線程池的性能的原因)。

對於任何請求(並不重要是誰做的)從池中獲取線程,請求被處理,然後線程返回到池。

+0

這不能回答你的問題。無論是新線程還是池化線程與兩個會話bean是如何創建的問題完全無關。 – EJP

0

有幾個因素影響回答你的問題,j2ee有製造商必須遵循的自己的規範和其他的,他們應該簡單地按照他們的意願實施。是要表現他們想要的,或者他們應該如何在某些時刻採取行動。 Jboss肯定不同於Apache Tomcat的性能問題,這使得很難回答你的第一個問題。然後回答:「這取決於你在說哪個供應商,具體是什麼容器?」 這也取決於你是否在你的代碼中實現了Enterprise JavaBeans,因爲那時可能會啓動幾個Bean(對象)(取決於容器)以及來自客戶端的每個請求,他可能會共享這些Beans或創建新Bean來解決競爭。

在我看來,回答他們的第四個問題,最好的方法是通過Singleton Session Bean(EJB實現)的計數器。但是你可以通過一個靜態類來完成,其中所有其他對象都可以共享,但必須解決對象之間的競爭。 EJB爲您解決了這個競爭,而不必浪費時間。是爲了這個和許多其他的東西解決方案的EJB我認爲如果你不實現EJB,並做一個非常簡單的代碼,對於客戶做的每個請求,一個對象將被創建和銷燬(不是真的,因爲它在發送響應給客戶端容器之後依賴於JVM來銷燬,垃圾收集,但是它不能訪問你)。但是,再次,取決於你如何編程,哪個容器...我希望我在你的詢問中幫助你。

我建議閱讀J2EE規範: JSR-000342 EE 7 Specification 這是一本關於EJB:Enterprise JavaBeans 3的好書。1,第6版 安德魯·李Rubinger,比爾·伯克

1

所以當2升管理員的跡象,在我的web應用程序,就會出現類ADMINUSER了相同的變量「ADMINUSER」

的2個對象

編號

如果該代碼行位於方法中,則該變量位於堆棧上,並且該方法的併發調用可以包含多個實例,包括多線程的遞歸和調用。

如果它是非靜態成員初始化代碼,則該變量位於該對象中,並且存在與該對象一樣多的實例。

如果對象是一個bean,它們的數量取決於對象的範圍:if application,one;如果會話,每個會話一個;如果查看,每個視圖一個;等等。

如果它是靜態成員初始化代碼,它不應該是。

這怎麼可能,它是2個不同的線程?

參見上文。

誰在管理這個線程,web容器?

是的,它也是管理bean實例。

如果是這樣,web容器是如何做到這一點,它是用threadLocal封裝應用程序代碼嗎?

否參見上文。

如果它的線程不同,爲了維護一個全局對象(比如說一個管理員訪問計數器的計數器),「static」就不夠用了......它需要是「volatile」而不是正確的?

不可以。您可以將其作爲應用程序範圍的bean的實例成員進行維護。

除了常量和緩存之外,您應該完全避免在web應用程序中使用靜態,您應該避免使用這些常量和緩存。

+0

感謝EJP提供的答案...對我來說它還不是很清楚,請耐心等待我的更多問題。 當我說「2類AdminUser的對象」時,我的意思是隻有2個會話作用域bean。所以在我的JVM中,有2個AdminUser類型的對象/ Bean,它有參考變量adminUser co存在...對吧?怎麼樣?這2個對象是由2個不同的線程創建的。? – KingJulien

+0

Java專家在那裏...好心的幫助...我對這個想法感到有點...... – KingJulien

+0

如果你有兩個會話範圍的bean,你有兩個會話。如果你有兩個AdminUser會話範圍的bean,admin usr通過兩個單獨的會話登錄了兩次。 – EJP

相關問題