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