簡體   English   中英

多線程如何為java Servlet工作?

[英]How does multithreading work for a java Servlet?

Java Servlet生命周期由servlet容器管理。 當第一個Web請求進入時,容器將加載Servlet類,調用其init方法,然后調用其服務方法來處理Web請求。 它說只有一個servlet類的實例。 容器創建多個線程並管理這些線程以處理多個Web請求(據我所知,這是我所知道的)。 但我想了解,多個線程如何運行並處理多個同時的Web請求,因為只有一個servlet類實例。 有人能說清楚這個嗎?

對象實例(的方法)可以由多個線程同時調用。 這不是特定於servlet的,並且通常是正確的。

發生這種情況會發生什么? 每個線程仍然有自己的堆棧,這意味着每個線程都有不同的局部變量副本可供使用。 因此,線程之間不會產生干擾,您不必擔心並發調用。 僅當訪問共享資源(例如實例/類變量)時,才會出現問題。 如果同時直接訪問實例/類變量也是一樣的。

相比之下,EJB完全符合您的建議。 EJB容器確保一次只有一個線程進入EJB實例,因此只要他/她不破壞EJB編程契約,EJB程序員就不必擔心並發性。 servlet規范沒有理由不這樣做。 在會議期間,很可能沒有人提出這個問題? 雖然您可以使用比EJB的“每個實例一個線程”更高效的並發管理,但它確實具有優勢。

在初始化完成之前,保護servlet免受並發調用。 完成此操作后,所有調用都會在您的servlet上同時執行。 這意味着如果需要同時處理兩個請求,則可以由兩個並發線程調用service方法。

如果此行為不適合您(例如,如果您使用某種非線程安全資源)並且確實不希望您的方法同時被多個線程調用,則可以標記您的service方法synchronized

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM