servlet生命周期和线程问题

来源:互联网 发布:phpmyadmin软件 编辑:程序博客网 时间:2024/06/05 17:57

Sevlet的四个重要的生命周期方法
构造方法: 创建servlet对象时调用,只调用1次,证明了sevlet是单例的。
init方法: 创建完对象之后调用。只调用1次。该方法用于初始化对象。
service方法: 在每次请求时调用,调用n次(在访问网页n次)。该方法入口方法,我们的逻辑代码在这里被调用。
destory方法:在servlet对象销毁之后调用。只调用1次。重新部署网站或者停止服务器,servlet对象就会销毁了。

当两个人同时抢一张票时会产生线程并发问题:
static int count=1;//票数
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    response.setContentType("text/html;charset=utf-8");    response.getWriter().write("你当前是第"+count+"个访客!");    //线程    try {        Thread.sleep(1000);//就有可能产生同时卖同一张票的情况    } catch (InterruptedException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    count++;}在同时从两个窗口对http://localhost:8080/day09_servlet/ThreadDemo访问,就是显示:你当前是第1个访客!更改:synchronized (ThreadDemo.class) {    response.getWriter().write("你当前是第"+count+"个访客!");    //线程    try {        Thread.sleep(1000);//就有可能产生同时卖同一张票的情况    } catch (InterruptedException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    count++;    }添加同步代码块:    synchronized (ThreadDemo.class)括号中就是类的名称.class。或者改成方法形式:

2 )同步方法
在doGet中调用 :method(response)
public synchronized static void method(HttpServletResponse response){
try {
response.getWriter().write(“你当前是第”+count+”个访客!”);
} catch (IOException e1) {
e1.printStackTrace();
} // A线程刚刚执行完这句代码,被B线程抢去了执行时机。

    //睡眠    try {        Thread.sleep(10000);    } catch (InterruptedException e) {        e.printStackTrace();    }    count++; }*/

**开发线程安全的servlet建议
1)尽量不要使用成员变量,或者静态成员变量。
2)必须要使用成员变量,要么给使用了成员变量的代码块加同步锁,加锁的代码块的范围尽量缩小,因为有可能影响程序并发效率。**

0 0