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 配置免密码登录
主要就是两步 : 1. scp ~/.ssh/id_rsa.pub root@远程ip地址:~/ 2. cat id_rsa.pub >> ~/.ssh/authorized_keys,把 ...
- Standalone Django scripts
Standalone Django scripts DJANGO_SETTINGS_MODULE=foo.settings
- UVA 11426 GCD - Extreme (II) (欧拉函数+筛法)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70017#problem/O 题意是给你n,求所有gcd(i , j)的和,其中 ...
- Protobuf一键生成代码bat文件
最近在摆弄Unity的Socket,需要用到Protobuf,一般都会有多个协议文件,所以研究了下bat的批处理,下面给出批处理文件代码: @echo off ::协议文件路径, 最后不要跟“\”符号 ...
- c# 实现IComparable、IComparer接口、Comparer类的详解
在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...
- 为什么 JavaScript 中基本数据类型拥有 toString 之类方法?
在 JavaSctipt 启示录一书中,关于为什么 JS 中基本数据类型可以调用一堆对象方法.大意即指,当原始数据类型(boolean,Number.String)在调用方法时,JS 将会创建对象,以 ...
- HTML第一天学习笔记
- HDU 5515 Game of Flying Circus 二分
Game of Flying Circus Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...
- URAL 1774 A - Barber of the Army of Mages 最大流
A - Barber of the Army of MagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/v ...
- 用C#.NET实现电子邮件客户程序
用C#.NET实现电子邮件客户程序 周华清 戴晟辉(东华理工学院计算机与通信系 江西 抚州 344000) [摘要]通过C#这种VisualSTudio.NET中新引入的面向对象且类型安全的编程语言, ...