servlet多线程安全问题
Servelet多线程安全问题
原因
一个servlet被实例化一次,当有多个用户访问时,多个线程会访问同一个实例,实例变量就会被不同的用户修改。
简单的案例
新建servlet,访问http://localhost:8080/serverlet/servlert1?u=aaa,即可看到aaa输出
public class servlert1 extends HttpServlet {
String username; //实例变量username
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
username=request.getParameter("u");
//睡眠5s,模拟多并发访问
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出u接收到的参数
response.getOutputStream().write((username).getBytes());
}
}
A访问http://localhost:8080/serverlet/servlert1?u=aaa
B立马访问http://localhost:8080/serverlet/servlert1?u=bbb
A输出bbb(A的数据被B修改了),B也输出BBB
解决
避免实例变量
public class servlert1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username;
username=request.getParameter("u");
//睡眠5s,模拟多并发访问
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出u接收到的参数
response.getOutputStream().write((username).getBytes());
}
}
Servlet 实现SingleThreadModel接口
public class servlert1 extends HttpServlet implements SingleThreadModel{
String username; //实例变量username
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
username=request.getParameter("u");
//睡眠5s,模拟多并发访问
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出u接收到的参数
response.getOutputStream().write((username).getBytes());
}
}
同步化
public class servlert1 extends HttpServlet {
String username; //实例变量username
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//同步访问
synchronized (this) {
username=request.getParameter("u");
//睡眠5s,模拟多并发访问
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出u接收到的参数
response.getOutputStream().write((username).getBytes());
}
}
}
servlet多线程安全问题的更多相关文章
- javaweb回顾第六篇谈一谈Servlet线程安全问题
前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例 ...
- Servlet线程安全问题
Servlet采用单实例多线程方式运行,因此是线程不安全的.默认情况下,非分布式系统,Servlet容器只会维护一个Servlet的实例,当多个请求到达同一个Servlet时,Servlet容器会启动 ...
- (2.1)servlet线程安全问题
本文参考链接:http://www.yesky.com/334/1951334.shtml 摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安 ...
- servlet多线程
一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组线程叫做工作者线程(Wor ...
- servlet 多线程
servlet在服务器中只有一个实例,那么它响应请求的方式应该是多线程. 一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线 ...
- Servlet的线程是不是共享同一个requset对象及servlet多线程
servlet多线程 一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组 ...
- Servlet线程安全问题(转载)
转载地址:https://www.cnblogs.com/LipeiNet/p/5699944.html 前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安 ...
- JAVAEE_Servlet_18_关于Servlet线程安全问题
关于Servlet线程安全问题 Servlet线程安全 Servlet 是单实例多线程的环境下运行的. 在服务器运行期间,一个Servlet接口实现类,只能创建一个实例对象(一个进程(Servlet接 ...
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...
随机推荐
- dubbo线程池作用于接口而不是方法
记一次线上dubbo服务超时和线程池满问题排查 可能调用的接口没问题,但是该服务中的其他接口占用完了线程池,导致调用超时被拒绝处理.
- 阿里高级架构师教你使用Spring JMS处理消息事务源码案例
消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失.该源码展示如何使用本地事务解决这个问题.这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听 ...
- mount命令解析
可以参考两位大神的理解 Linux mount 命令 Linux的mount命令详解
- python之闲聊数据类型及常用操作符
Day 1-afternoon 所谓闲聊,也称gossip.下面开始... 整型 python3 的整型与长整型进行了无缝结合,长度不受限制. 浮点型 包括科学计数法 E.(用法同C) 布尔类型 即特 ...
- airtest使用
airtest Airtest是网易开发的手机UI界面自动化测试工具 通过截图功能操作手机虽然方便,但是截图涉及到分辨率的问题,代码不能在不同的手机上通用. 可以用来开发手机App爬虫 使用先抓大再抓 ...
- vs看源代码
资源地址:https://www.cnblogs.com/HouZhiHouJueBlogs/p/4274197.html 资源地址:http://referencesource.microsoft. ...
- Educational Codeforces Round 76 (Rated for Div. 2) D
D题 原题链接 题意:就是给你n个怪兽有一个属性(攻击力),m个英雄,每个英雄有两种属性(分别为攻击力,和可攻击次数),当安排最好的情况下,最少的天数(每选择一个英雄出战就是一天) 思路:因为怪兽是不 ...
- TCP中的长连接和短连接(转载)
原文地址:http://www.cnblogs.com/onlysun/p/4520553.html 次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的 示意图: ...
- [唐胡璐]Android自动化- 测试环境搭建中遇到的问题
这里主要讲一下在配置过程中遇到一个小问题,其他的步骤会略过。 安装JDK,并设置环境变量 下载Android ADT, 解压后,文件夹显示如下: Download the ADT bundle for ...
- 同一网断多套keepalived,vrid冲突问题排查
注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下. Keepalived_vrrp[27120]: ip address associated with ...