JAVAEE_Servlet_18_关于Servlet线程安全问题
2024-09-04 19:38:35
关于Servlet线程安全问题
Servlet线程安全
Servlet 是单实例多线程的环境下运行的。
在服务器运行期间,一个Servlet接口实现类,只能创建一个实例对象(一个进程(Servlet接口实现类的实例对象) 对应 多个线程(用户请求),无论有多少个用户请求来访问该Servlet实例对象,都只是访问的同一
个Servlet实例对象), 在服务器关闭的时候,会将所有创建的Servlet实现类的实例对象销毁。什么时候会出现线程安全问题?
1.多线程并发执行
2.存在共享数据
3.共享数据有修改操作。
分析在JVM虚拟机中哪些数据可能会存在线程安全问题,而哪些数据不会存在线程安全问题 ?
1.首先局部变量不存在线程安全问题,因为局部变量在栈中存储,一个线程一个栈,这样每个线程的栈内存中都有自己的局部变量,所以局部变量内存空间不共享,也就不存在线程安全问题。 2.常量不会被修改所以常量不存在线程安全问题。 3.所有线程共享一个堆。 - 堆内存中存储了Java对象。(new出来的java对象在堆中存储) - 对象中的实例变量是多线程共享的。当多线程并发操作,共同访问实例变量,并且涉及到修改操作的时候,就存在线程安全问题。(因为堆内存是多线程共享的,而存储在堆内存中的对象也就是共享的,对象中的实例变量也就是被共享的) 4.所有线程共享一个方法区。 - 方法区中的静态变量也是多线程共享的,当多线程并发操作,共同访问,并且涉及到修改操作静态变量的时候,也会存在线程安全问题。 5.线程安全问题不只存在JVM中,也存在数据库中,例如:多线程同时修改一张表。 - 解决方案: 5.1 在java程序中使用synchronized关键字,让线程排队执行。 5.2 行级锁(悲观锁) 5.3 事务隔离级别 5.5 乐观锁
6.怎么解决Servlet的线程安全问题?
解决方案: 6.1 不使用实例变量,尝试使用局部变量 String username=request.getParameter("username"); 6.2 若必须使用实例变量,那么考虑将该对象变成多例对象,一个线程一个java对象,这样实例变量的内存也不会共享了。 6.3 若必须使用单例对象,那就只能使用synchronized线程同步机制,但是线程一旦排队执行,那么降低了吞吐量。用户体验下降。 synchronized(this) { username=request.getParameter("username"); response.getWriter().print("Congratulation "+username+" register success!!!");
}
最新文章
- js实现web网页版台球游戏
- Cannot execute as the database principal because the principal ";guest"; does not exist, this type of principal cannot be impersonated, or you do not have permission.
- excel将单元格格式由数字转为文本
- poj 2389.Bull Math 解题报告
- 关于X锁的问题--由select+X锁是否持有到事务结束的误区
- Diskpart使用说明
- Android开发如何在4.0及以上系统中自定义TitleBar
- Java学习笔记之继承
- 关于Windows® API Code Pack for Microsoft® .NET Framework
- Hash Map (Hash Table)
- YII 多表联查 纵表
- dotnet core使用开源组件FastHttpApi进行web应用开发(转)
- Javaweb编程中的乱码问题
- 【Vagrant】-NO.130.Vagrant.1 -【Vagrant】
- XXX系统项目目标文档课堂讨论
- Android -- 使用WindowManager实现悬浮框效果
- springboot项目访问不到controller方法。
- UVa 1614 奇怪的股市
- File.separator与 \分隔符
- X-UA-Compatible也无法解决的IE11兼容问题
热门文章
- 翻译:《实用的Python编程》02_04_Sequences
- Example之selectOneByExample方法和selectByExample的使用
- Java后台防止客户端重复请求、提交表单
- apiAutoTest:支持自定义函数,用例中可调用
- ubuntu系统共享桌面的使用和配置
- 基于Docker Compose部署分布式MinIO集群
- Django的ORM封装接口详细
- Git:本地仓库管理
- 【Azure 服务总线】Azure Service Bus中私信(DLQ - Dead Letter Queue)如何快速清理
- 基于云原生DevOps服务自动化部署前端项目学习总结