在Java Servlet的運行機制中,每個Servlet類只會被實例化一次,然后該實例將一直存在于整個應用程序的生命周期中。
當第一個請求到達一個Servlet時,容器(例如JavaEE容器,如Tomcat或Jetty)將創建該Servlet的一個實例,并調用其初始化方法(通常是`init()`方法)。這個初始化方法只會被調用一次,用于執行一些初始化操作,比如加載配置文件、建立數據庫連接等。
一旦Servlet實例化并初始化完成,它將可以處理多個請求。對于每個新的請求,容器將創建一個新的線程,但仍然使用相同的Servlet實例來處理請求。這意味著Servlet實例將被多個線程共享,但是容器會確保每個線程都在單獨的執行上下文中執行,以避免并發問題。
當應用程序關閉或重新部署時,容器會銷毀Servlet實例,調用其銷毀方法(通常是`destroy()`方法)。銷毀方法也只會被調用一次,用于執行一些清理操作,比如關閉數據庫連接、釋放資源等。
這種"只實例化一次"的機制可以提高Servlet的性能和效率,因為它避免了多個請求之間重復創建和銷毀Servlet實例的開銷。同時,它也意味著在Servlet中不應該存儲與請求相關的狀態信息,因為該狀態可能被其他請求所共享。如果需要在Servlet中存儲請求特定的狀態信息,可以使用線程安全的方式,如使用局部變量或同步機制。