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