javaweb学习总结二十三(servlet开发之线程安全问题)
一:servlet线程安全问题发生的条件
如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源。如果访问
的不是相同资源,则不存在线程安全问题。

实例1:不会产生线程安全问题,因为每个客户端发送请求,都会创建一个线程,都会创建一个count
不存在资源共享的问题。
1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3 int count = 0;
4 count++;
5 response.getOutputStream().write((count + "").getBytes());
6 }
实例2:这种方式,多个线程公用资源,应该存在线程安全问题,但是我的测试结果一直不存在线程安全问题。有点不解?
1 public class ServletDemo extends HttpServlet {
2
3 int count = 0;
4
5 public void doGet(HttpServletRequest request, HttpServletResponse response)
6 throws ServletException, IOException {
7 count++;
8 try {
9 Thread.sleep(1000 * 10);
10 } catch (InterruptedException e) {
11 e.printStackTrace();
12 }
13 response.getOutputStream().write((count + "").getBytes());
14 }
15
16 }
二:线程安全问题的处理
1:对于线程安全问题最简单的方式就是加锁:
将存在线程安全问题的代码放到同步代码块中,这样线程访问时就需要排队拿到钥匙,只有上一个
线程访问完毕,才会释放掉锁,先一个线程才可以进入。但是存在明显的缺点:就是效率太低了。
例如:门户网站日访问量过千万,效率太低了。
注意:应该尽量减少代码在同步代码块中
1 synchronized (this) {
2 count++;
3 try {
4 Thread.sleep(1000 * 10);
5 } catch (InterruptedException e) {
6 e.printStackTrace();
7 }
8 response.getOutputStream().write((count + "").getBytes());
9 }
2:实现singleThreadModel接口
servlet实现singleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题
,但是servlet响应客户端请求的效率太低,所以已经淘汰。
javaweb学习总结二十三(servlet开发之线程安全问题)的更多相关文章
- javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)
一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录, ...
- javaweb学习总结(二十三)——jsp自定义标签开发入门
一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...
- JavaWeb学习(二十三)———Filter(过滤器)
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules
amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
随机推荐
- linux下面的查找命令
在linux下面经常用查找命令,我自己最常用的是find whereis locate 关于find 我常用find的基本功能,如 find / -name filename 在某个目录下寻找文件. ...
- ASP.NET Web Api返回对象类型为JSON还是XML
在Umbraco平台上开发过程中,我用WebApi返回JSON result给前端 前端使用React调用这个web api来获取JSON result 我写的web api方法是返回JSON 类型的 ...
- 转载 C#中静态类和非静态类比较
转载原地址: http://www.cnblogs.com/NothingIsImpossible/archive/2010/07/28/1786706.html C#静态方法与非静态方法的区别不仅仅 ...
- CodeForces 548A Mike and Fax (回文,水题)
题意:给定一个字符串,问是不是恰好存在 k 个字符串是回文串,并且一样长. 析:没什么好说的,每次截取n/k个,判断是不是回文就好. 代码如下: #include<bits/stdc++.h&g ...
- Mac下的eclipse 4.6的tomcat插件安装正确姿势
最新版 eclipse 4.6 (Neon) tomcat 插件的安装, 解决tomcat插件tomcatPluginV331不能使用的问题. 1.打开最新版的 eclipse 4.6 (neon), ...
- 字符串匹配 - KMP算法
#include<cstdio> #include<cstring> #include<cstdlib> void GetNext(char *t,int *nex ...
- cocos2d-x 读取.plist文件
转自:http://blog.csdn.net/hgplan/article/details/8629904 在cocos2d-x中可以用.plist格式的文件来保存数据,它是XML文件格式的一种,在 ...
- win7硬盘安装Ubuntu12.04 64位时显示Error 15: File not found.
安装Ubuntu12.04 -64位时,用EasyBCD建好引导文件重启电脑后出现如下错误: Error 15: File not found 原因一个是安装文件所在盘符不对,另一个是文件名.Ubun ...
- Linux 安装oracle10g 配置dataguard 介绍和步骤
DataGuard是甲骨文推出的一种高可用性数据库方案,在Oracle 8i之前被称为Standby Database.从Oracle 9i开始,正式更名为Data Guard.它是在 ...
- Java中的Annotation(2)----Annotation工作原理
Java中的Annotation(2)----Annotation工作原理 分类: 编程语言2013-03-18 01:06 3280人阅读 评论(6) 收藏 举报 上一篇文章已经介绍了如何使用JDK ...