package com.csdn.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
//5、演示线程不安全的问题
@WebServlet("/h05")
public class ThreadUnsafeServlet extends GenericServlet {
public Integer i = 1;
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
if (i % 2 == 0) {
System.out.print("A");
} else {
System.out.print("B");
}
i++;
}
}
java复制代码
- Servlet在tomcat容器中是单实例的是线程不安全的
① 单实例的意思是:所有客户端发过来的请求都是同一个ServletLifecycle实例来处理
第一个用户发请求过来时,容器会去实例化servlet,然后进入服务阶段,从此之后,所有的请求到来时,直接执行服务方法
② 线程不安全的意思时:既然所有的请求到来时是同一个servlet实例去处理的,那么这些请求之间不能共用数据(共用变量)
什么情况下共用变量?servlet中有成员变量,而服务方法中需要根据成员变量的值决定程序流程
如果第一个请求到来时,执行服务方法,然后在服务方法中更改成员的值,从而就会导致其他的请求到来时流程发生变化
小结:线程不安全的本质是:Servlet由成员变量;成员变量的值可能发生变化;业务逻辑依赖于这个变量
③ 如何解决线程不安全的问题:尽量避免使用成员变量;如果非要使用成员变量,那么要注意业务逻辑不要受成员变量值影响