servlet生命周期和线程问题

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值