Servlet线程安全性
问题:使用以下的代码演示servlet的线程安全问题?
1 public class MultiThreadQuestion extends HttpServlet { 2 public int count = 0; 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 // 1. 验证服务器是以线程的方式处理用户请求的 6 try { 7 this.count++; 8 Thread.sleep(5 * 1000); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 response.getOutputStream().write(("线程名:"+Thread.currentThread().getName()+"count="+this. count).getBytes()); 13 } 14 }
同时访问以上的代码发现三次同时出现3,这就是线程的并发访问的问题。
解决方案就是:同步
给访问共享资源的代码加锁。
1 public class MultiThreadQuestion extends HttpServlet { 2 public int count = 0; 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 // 1. 验证服务器是以线程的方式处理用户请求的 6 synchronized (this) { 7 try { 8 this.count++; 9 Thread.sleep(5 * 1000); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 response.getOutputStream().write(("线程名:"+Thread.currentThread().getName()+"count="+this.count).getBytes()); 14 } 15 } 16 }
总结:
1.如果直接使用同步关键字,那么会导致servlet的运行效率严重的降低。
2.尽量避免使用servlet的成员变量。
3.如果避免不了那么我们就需要使用线程安全的成员变量。
ArrayList Vector HashSet
如果需要不是线程安全的集合可以使用Collections进行线程安全的转换
4.ServletContext、HttpSession需要使用的时候一定要使用同步。
5.在servlet中最好使用局部变量。
转载于:https://www.cnblogs.com/friends-wf/p/3729297.html
Servlet线程安全性相关推荐
- 深入研究Servlet线程安全性问题
摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍. ...
- servlet的线程安全性问题
servlet本身运行不存在所谓线程是否安全性的问题,取决于我们如何使用servlet. 以tomcat web container举例 ,servlet加载后以单实例 方式存在于容器之中,由于容器肯 ...
- java并发编程实践(2)线程安全性
[0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...
- Java 并发基础——线程安全性
线程安全:多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么久称这个类是线程安全的. 在线程安 ...
- Java并发(理论知识)—— 线程安全性
1.什么是线程安全性 当多个线 ...
- 线程安全性的基础知识
"共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其周期内是可以发生变化的. 一个对象是否是线程安全的,取决于它是否被多个线程访问. 当多个 ...
- Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结
分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 前言 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用reque ...
- Spring 中获取 request 的几种方法,及其线程安全性分析
概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等 ...
- 【Java并发.2】线程安全性
要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享(Shared)和可变的(Mutable)状态的访问. "共享"意味着变量可以由多个线程同时访问,而" ...
- Spring中获取request的方法及其线程安全性分析
在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等.由于 ...
最新文章
- 子对象是什么java_面向对象编程(什么是对象)——java
- android 系统gpu 调试_[RK3288][Android6.0] 调试笔记 --- 读取当前DDR和GPU频率方法
- UNIX网络编程——TCP/IP简介
- php的excel源码下载,PHPExcel-5 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...
- 必备收藏 | 超详细揭秘 Redis 持久化,建议收藏!
- Python装饰器总结,带你几步跨越此坑!
- [Xpand] Error	1	Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default
- Laravel debug bar 调试利器
- IOS 拉伸图片(封装)
- 产品读书《浪潮之巅》
- 初中英语听力计算机考试反馈,【初中英语】英语听说机考,怎样才能有效提高英语听力和口语水平?...
- C语言实现乘法原理,伽罗华乘法原理与C语言实现
- THREE.JS中常用的3种材质
- Eclipse Plungins--Pydev
- 永强教你加解密:对称篇(一)
- 【计算机网络】第三话·浅谈OSI和TCP/IP模型
- wlan源码中Country Code 与 regDomain的对应关系表
- FME转换LPK层文件到AUTOCAD报错
- ib 盈透数据 matlab,请教下怎样$IB盈透里ES的历史数据
- 深入理解字符串的不可变性[java]