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线程安全的主要内容,如果未能解决你的问题,请参考以下文章