【JavaWeb】servlet线程安全

18 篇文章 0 订阅

servlet线程安全

1、抢占式调度原则


抢占式(Preemptive) 允许将逻辑上可继续运行的在运行过程暂停的调度方式 可防止单一进程长时间独占CPU 系统开销大(降低途径:硬件实现进程切换,或扩充主存以贮存大部分程序)

比如上厕所

  • 三个人ABC,但是只有一个厕所,那么如何调度使用
  • 如果按照 计划调度,就会出现一个现象,A 的时间段 C想上厕所,但是在A的时间段,C只能等到自己的时间段,而A却一直没用厕所,这样就造成了浪费
  • 所以就出现了 抢占,不按计划调度,谁想上,就直接去,抢到就可以上,这时候又出现一个问题,A和B同时想去厕所,那俩人谁也不让,就会发生矛盾,这时候就不安全了
  • 所以按 计划调度,安全但是效率慢按抢占调度,就会效率提高但是不安全
  • 我们对于不安全的厕所的解决方式,就是 安一把锁,谁抢到了,把门锁上,另一个再外面等着

2、解决servlet线程安全


我们使用的servlet是线程不安全的,所以是高效的,就像是上面没有锁的厕所

解决方案:

  • 通过 synchronized关键字或者lock锁
  • 可以通过 实现接口SingThreaModel
  • 使用的时候 尽量注意共享问题

模拟servlet的线程不安全:

@WebServlet("/safe")
public class SafeServlet extends HttpServlet {
    // 公用输出对象
    PrintWriter writer;
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("name");
        // 获得输出对象
        resp.setContentType("text/html;charset=utf-8");
        // 为了能让别人一定抢到,设置延时
        synchronized (this){
            writer = resp.getWriter();
            try {
                Thread.sleep(5000);
                writer.println(name);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 如果 不加锁,我们访问俩个safe,携带不同的参数,会发现 俩次的名字会出现同一个页面。
  • 如果像上边 加了锁,我们访问俩个safe,携带不同的参数,会发现 俩次的名字会正常出现在各自的页面。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值