2009-07-28 40 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重用实例变量是安全的,因为它得到。