首页 > 其他分享 >你怎么设计一个线程安全的Servlet?

你怎么设计一个线程安全的Servlet?

时间:2022-10-31 12:35:16浏览次数:39  
标签:resp req 安全 实例 线程 message Servlet out


1.最直接的办法,就是用上面的SingleThreadModel接口

既然单例会有共享实例变量导致线程不安全的问题,那就改成多例的呗。

你怎么设计一个线程安全的Servlet?_爬虫

但是,这个接口都已经被官方废弃了,这就说明官方也不推荐这么做。原因很简单,那就是这样一来会有很多个实例,性能的代价太大了。

2. 用同步锁

 这也是非常容易想到的办法,把当前对象锁起来,不返回不给其他用户插入(怎么有点怪怪的?)

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

synchronized(this){
message = req.getParameter("message");
PrintWriter out = resp.getWriter();
//故意延时5秒钟,使得下一次请求过来的时候,message的值还没有释放
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.write(message);
out.flush();
out.close();

}

}

这样的代价就是等待时间更长了,参考火车上的的卫生间,这就是同步锁。

3. 尽量别用实例变量,用局部变量代替

 

标签:resp,req,安全,实例,线程,message,Servlet,out
From: https://blog.51cto.com/u_10957019/5809089

相关文章

  • JAVA面试官:请说说如何设计线程安全的单例模式?
    单例模式已经被讲烂了,这边复习一下双重检测锁下的线程安全的单例模式。(单例模式复习顶配)publicclassMySingleton{privatestaticvolatileMySingletonmySingleto......
  • 你能证明Servlet线程不安全吗?
    Servlet默认是线程不安全的!Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。  当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml......
  • 秋招面试:如何证明Servlet是单例的?
    今天和大家分享一个经典的面试题:如何证明Servlet是单例的?Servlet一般都是单例的,并且是多线程的。如何证明Servlet是单例模式呢?很简单,重写Servlet的init方法,或者添加一个构......
  • 面试题:如何让Servlet变成多例?
    方法1.实现 SingleThreadModel接口(不推荐,官方已经将这个接口废弃)publicclassMyServletextendsHttpServletimplementsSingleThreadModel{publicMyServlet(){......
  • 端口安全学习笔记
    端口安全记录一些端口渗透时的方法和思路免责声明本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.大纲Tips......
  • 什么是线程,进程?
    一、线程的基本概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它......
  • Java多线程Thread详细讲解(万字教程)
    一、线程的基本概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它......
  • 浅谈Java多线程之FutureTask
    Runnable和Callable是多线程中的两个任务接口,实现接口的类将拥有多线程的功能,FutureTask类与这两个类是息息相关!FutureTask继承体系看下这张图,原来FutureTask类实现了Runnab......
  • mysql主从复制三个线程
    mysql主从同步很慢查看是io还是sql经过分析,业务那边在删除一个大表数据,从库单线程处理不过来,且io性能也比较低,造成堆积[mysql@mysql192-168-0-36/data/mysqldata1/relaylog......
  • 守护线程
    守护线程一、守护线程定义:setDaemon:将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。当我们在......