[英]Towards understanding servlets and multi-threading
因此,我讀了這個很棒的線程: 每個servlet實例與servlet中每個servlet線程之間的區別?
它說:“ servlet容器為每個請求重用相同的servlet實例。”
假設我們有一個servlet:
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Servlet容器也是如此,初始化時將在內部調用:
MyServlet myServlet = new MyServlet(....);
然后,當請求與web.xml中的內容匹配時,它將返回此實例myServlet。
我需要幫助的理解是,何時致電:
myServlet.doGet(..)
只有1個實例時,多線程如何工作? 這並不是真正針對servlet的,我只是無法理解它是如何工作的。
假設網站上有10個並發用戶恰好同時點擊了這個servlet,這個實例在所有用戶中都是共享的,為什么它不然后以串行方式阻塞並工作,它是如何並行執行的呢?
這並非特定於Servlet。 這是特定於Java的。 Java語言和VM 支持通過多個線程調用單個方法。 每個線程將只擁有其自己的方法局部變量份額。 如果要限制此范圍,則必須向該方法添加synchronized
鎖,或者讓Servlet實現(不建議使用!) SingleThreadModel
接口。 但這不是必需的,如果您以線程安全的方式編寫servlet方法(即,不要將請求/會話范圍的數據分配為實例變量)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.