Servlet 线程安全问题

Servlet 默认是单例模式,所以说 Tomcat 只创建一个实例,所以当多个线程同时访问同一个Servlet 的时候,Servlet是线程不安全的

问题

Servlet 线程不安全问题是建立在 Java 多线程的基础之上,它的生命周期是由Servlet容器(即Tomcat)来维护与管理的

当客户端第一次发送请求时,内部的Dispatcher线程来处理和分发Web请求,也就说Dispatcher线程从线程池中选出一个工作组线程,并将请求传递给该线程,并会对请求相对应的Servlet对象执行 init()方法 进行初始化,然后再调用 service() 方法

当客户端发起第二次请求时,则会直接调用 service() 方法,不会再调用 init()方法,因为 servlet对象是单例的

如果客户端发起多次并发请求,可能会导致多个线程同时调用 service() 方法,如果代码中定义了实例变量或静态变量,那么可能就会发生线程不安全的问题,也就是说可能存在多个线程,在同一时间使用同一个变量

解决

  1. 不在 servlet 中使用成员变量,改为使用局部变量或者使用安全类,比如 java.util.concurrent 下的类,使用原子类 AtomicInteger,能够保证线程安全问题,避免出现数据不一致
  2. 可以给 servlet 中的方法添加 自动锁synchronized 或者 手动锁Lock,但是也会带来一些不好的就是,在并发请求访问时,会造成线程阻塞等待
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值