java - servlet 聲明一個(gè)私有靜態(tài)類對(duì)象成員,那么在doPost等方法中使用該類對(duì)象的方法是否線程安全?
問題描述
public class MyServlet extends HttpServlet { private static IUtils utils= null; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {utils.do(); }}
代碼結(jié)構(gòu)如上,do不是靜態(tài)方法,且方法內(nèi)使用的都是局部變量,做的事情就是連接數(shù)據(jù)庫做查詢,然后返回查詢結(jié)果。1.在doPost調(diào)用這個(gè)do方法是否安全?2.是否有必要聲明成靜態(tài)的,我希望這個(gè)utils不要被反復(fù)創(chuàng)建。
問題解答
回答1:每一個(gè) Servlet 對(duì)象在 Web 容器中只有一個(gè)實(shí)例(單例模式),所以如果多個(gè) HTTP 請(qǐng)求請(qǐng)求的是同一個(gè) Servlet,那么多個(gè) HTTP 請(qǐng)求對(duì)應(yīng)的線程將并發(fā)調(diào)用 Servlet 的 doPost 方法 —— 簡(jiǎn)單起見,可以將你的 IUtils 使用 ThreadLocal 封裝。
