小妹,刚接触servlet和java很多基本东西都不懂!请各位大神指导指导!Servlet是单实例,多线程:使用synchronized块解决同步问题,在Servlet中尽量少使用成员变量,一旦使用必须自己维护其并发问题。
这个成员变量是啥意思,定义字符串接收表单的数据也属于成员变量的范围吗? String PostalCode=new String(request.getParameter("PostalCode").getBytes("ISO-8859-1"), "utf-8");
String CityName=new String(request.getParameter("CityName").getBytes("ISO-8859-1"), "utf-8");
String Traffic=new String(request.getParameter("Traffic").getBytes("ISO-8859-1"), "utf-8");
String TravelInformation=new String(request.getParameter("TravelInformation").getBytes("ISO-8859-1"), "utf-8");
String Description=new String(request.getParameter("Description").getBytes("ISO-8859-1"), "utf-8");
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
try{
City city=new City();
CityVa va=new CityVa();
int cPostalCode = Integer.parseInt(PostalCode);
va.setPostalCode(cPostalCode);
va.setCityName(CityName);
va.setTraffic(Traffic);
va.setTravelInformation(TravelInformation);
va.setDescription(Description);
city.addCity(va);
out.println ("<script>alert('信息添加成功!');location.href='../city/cityadd.jsp';</script>");
}
catch(Exception ex){
   out.println (ex.toString());
    }
out.flush();
out.close();

解决方案 »

  1.   

    成员变量譬如:public class XXXServlet extends HttpServlet
    {
       //这两个就是成员变量,并发操作的时候需要受同步保护
       private String name;
       private Person persion;

    }
      

  2.   

    成员变量譬如:public class XXXServlet extends HttpServlet
    {
       //这两个就是成员变量,并发操作的时候需要受同步保护
       private String name;
       private Person persion;
    }
      

  3.   

    楼上说的很正确。
    doXXX()这些方法里面的变量属于局部变量,不会产生并发问题。
      

  4.   

    public class SafeSservlet extends HttpServlet {
    private String name;
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     name = request.getParameter("name");
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    response.getWriter().println("你的名字是:"+name);
    }
    }
    这里的name定义在类里面,是成员变量,因为Servlet是单实例,所以这里的name只有一个内存空间,当你发送一个请求时,service方法执行一次,就给这个name赋一个值如:A,结果这个线程睡了一会,name值还没返回给你,又有另一个人发送一个请求,service方法又执行一次,就把这个name的值改掉了如改成:B,等你睡醒后,返回给你的值就是B,而不是你先传入的A,这就产生并发问题了。
    而如果你把name变量定义在方法里,当你发送一个请求时,service方法执行一次,就会创建一块内存空间来存放name值,同时别人发送一个请求,执行service方法,又会创建一块新的内存空间来存放他的name值,这就不会产生并发问题了。