当前位置:编程学习 > JAVA >>

servlet并发问题

小妹,刚接触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(); --------------------编程问答-------------------- 成员变量譬如:

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

public class XXXServlet extends HttpServlet
{
   //这两个就是成员变量,并发操作的时候需要受同步保护
   private String name;
   private Person persion;
}
--------------------编程问答-------------------- 楼上说的很正确。
doXXX()这些方法里面的变量属于局部变量,不会产生并发问题。 --------------------编程问答-------------------- 那我上面那个方法里面的代码是否会产生并发问题呢? --------------------编程问答--------------------
引用 4 楼 xiaowan901223 的回复:
那我上面那个方法里面的代码是否会产生并发问题呢?


不会,方法里面声明创建的变量的生命周期是随着方法的结束而结束,是不会引起并发问题的 --------------------编程问答-------------------- 没有并发,这个 --------------------编程问答--------------------
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值,这就不会产生并发问题了。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,