有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

线程安全java servlet

我需要知道以下代码在线程方面是否存在任何问题。我一直认为,只要不使用类级变量,线程就不是问题

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);
}

共 (2) 个答案

  1. # 1 楼答案

    通常,servlet容器中只有一个servlet实例一次可重入地服务多个请求。因此,由于竞争条件,使用实例变量将事物从一个方法传递到另一个方法是baad的想法

    最好(也是最简单)的解决方法是编写自己的“处理程序”类,每个请求实例化一次,然后将所有内容传递给它。在代码中,它看起来是这样的:

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

    现在在MyHandler中,重用实例变量是非常安全的

  2. # 2 楼答案

    你说得对

    只要你不使用类级变量,你的Servlet就会是线程安全的

    为了安全起见,不妨让您的类级别Stringfinal

    final String CLASS_NAME = "UploadReferralImage";