2009-07-28 17 views
3

我需要知道線程是否存在與下面的代碼有關的任何問題。我總是覺得只要不使用類級變量,線程就不是問題。線程安全的java小服務程序

public class UploadReferralImage extends HttpServlet 
{ 
    String CLASS_NAME = "UploadReferralImage"; 

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    // Not handling Get, service must be invoked via Post. 
} 

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    String METHOD_NAME = "doPost"; 
    LogHelper.debug(PACKAGE_NAME, CLASS_NAME, METHOD_NAME, "Made it to the servlet"); 
    String reply = upload(request); 
    response.setHeader("Content-Type", "text/xml"); 
    response.getWriter().write(reply); 
    response.getWriter().flush(); 
    response.getWriter().close(); 
} 

public String upload(HttpServletRequest request) 
{ 

    String METHOD_NAME = "upload"; 
    LogHelper.debug(PACKAGE_NAME, CLASS_NAME, METHOD_NAME, "Inside upload"); 
    String replyMsg = "Unable to call ImageUpload"; 

    try 
    { 
     ObjectInputStream inputFromApplet = new ObjectInputStream(request.getInputStream()); 
     FileBean fBean = (FileBean) inputFromApplet.readObject(); 

     inputFromApplet.close(); 
     LogHelper.debug(PACKAGE_NAME, CLASS_NAME, METHOD_NAME, fBean.getFileName()); 

     replyMsg = doImageUpload(fBean); 

     } 
     catch (IOException e) 
    { 
     e.printStackTrace(); 
      replyMsg = "Exception :" + e.toString(); 

    } 
     catch (ClassNotFoundException e) 
    { 
     e.printStackTrace(); 
      replyMsg = "Exception :" + e.toString(); 
    } 

    return replyMsg; 
} 

private String doImageUpload(FileBean fBean) 
{ 
     //Save the file and return the response 
     SaveCaseClientAgent saveCaseClientAgent = new SaveCaseClientAgent(); 
     saveCaseClientAgent.save(fBean); 
} 
+0

看起來很好。你有理由相信它不是? – skaffman 2009-07-28 15:18:17

+0

我只是擔心上傳方法公開,不知道爲什麼我這樣做將不得不糾正它。但到目前爲止沒有問題。 – Keibosh 2009-07-28 15:28:40

回答

3

你是對的。

只要您遠離使用類級變量,您的Servlet將是線程安全的。

爲了安全起見,不妨讓你的類級Stringfinal

final String CLASS_NAME = "UploadReferralImage"; 
1

通常只有一個在servlet容器中的servlet,重入用於在同一時間多個請求的實例。因此,使用實例變量將事物從一種方法傳遞到另一種方法是因爲競爭條件而引發的一種錯誤觀念。

解決這個問題的最好(也是最簡單的)方法是編寫自己的「處理程序」類,您將在每個請求中實例化一次並將所有內容傳遞給它。在代碼中,它看起來像:

public void doGet(HttpServletRequest req, HttpServletResponse resp) { 
    new MyHandler().doGet(req, resp); 
} 

現在MyHandler重用實例變量是安全的,因爲它得到。