JavaWeb学习笔记-10servlet线程安全

Posted Moon&&Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb学习笔记-10servlet线程安全相关的知识,希望对你有一定的参考价值。

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,携带不同的参数,会发现 俩次的名字会正常出现在各自的页面。

以上是关于JavaWeb学习笔记-10servlet线程安全的主要内容,如果未能解决你的问题,请参考以下文章

servlet学习笔记_2

Servlet笔记11--补充

JavaWeb学习笔记之Servlet

JAVAWEB学习笔记13_servlet

JavaWeb Servlet 学习笔记总结( 一 )

JavaWeb学习笔记-07servlet生命周期