【問題描述】
最近公司安排我面試Java的FreshMan,面試者一般是工作1年多點(diǎn)的新人(這里我就裝老一下,其實(shí)我也才工作3年不到),在被問及Struts1和Struts2的Action的線程安全問題的時候,大多是支支吾吾,答不出所以然。所以在這里我整理一下我個人的理解。
【問題答案】
這是由于Servlet的工作原理產(chǎn)生的。我們先來簡單回顧一下Servlet的生命周期“初始化->init->service->destroy->卸載”。
這里大家都知道,我們在web.xml里面定義一個servlet的時候,我們可以給他們設(shè)置一個“l(fā)oad-on-startup” 的值,如果 Servlet 的 load-on-startup 配置項(xiàng)大于 0,那么在 Context 容器啟動的時候就會被實(shí)例化,并且tomcat給每一個servlet加載并且實(shí)例化一個對象(注解:也就是說,我們用戶在web.xml里面配置的每一個servlet都會被實(shí)例成一個servlet對象)
a, 下面的配置表示會有兩個servlet對象被實(shí)例化,即使他們對應(yīng)的是同一個servlet class
<?xml version="1.0" encoding="UTF-8"?>ServletTest1 web.servlet.ServletTest1 ServletTest1 /servlet/ServletTest1 ServletTest2 web.servlet.ServletTest1 ServletTest2 /servlet/ServletTest1