问题:使用以下的代码演示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线程安全性相关推荐

  1. 深入研究Servlet线程安全性问题

    摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍. ...

  2. servlet的线程安全性问题

    servlet本身运行不存在所谓线程是否安全性的问题,取决于我们如何使用servlet. 以tomcat web container举例 ,servlet加载后以单实例 方式存在于容器之中,由于容器肯 ...

  3. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  4. Java 并发基础——线程安全性

    线程安全:多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么久称这个类是线程安全的. 在线程安 ...

  5. Java并发(理论知识)—— 线程安全性

    1.什么是线程安全性                                                                                      当多个线 ...

  6. 线程安全性的基础知识

    "共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其周期内是可以发生变化的. 一个对象是否是线程安全的,取决于它是否被多个线程访问. 当多个 ...

  7. Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结

    分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 前言 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用reque ...

  8. Spring 中获取 request 的几种方法,及其线程安全性分析

    概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等 ...

  9. 【Java并发.2】线程安全性

    要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享(Shared)和可变的(Mutable)状态的访问. "共享"意味着变量可以由多个线程同时访问,而" ...

  10. Spring中获取request的方法及其线程安全性分析

    在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等.由于 ...

最新文章

  1. 子对象是什么java_面向对象编程(什么是对象)——java
  2. android 系统gpu 调试_[RK3288][Android6.0] 调试笔记 --- 读取当前DDR和GPU频率方法
  3. UNIX网络编程——TCP/IP简介
  4. php的excel源码下载,PHPExcel-5 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...
  5. 必备收藏 | 超详细揭秘 Redis 持久化,建议收藏!
  6. Python装饰器总结,带你几步跨越此坑!
  7. [Xpand] Error 1 Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default
  8. Laravel debug bar 调试利器
  9. IOS 拉伸图片(封装)
  10. 产品读书《浪潮之巅》
  11. 初中英语听力计算机考试反馈,【初中英语】英语听说机考,怎样才能有效提高英语听力和口语水平?...
  12. C语言实现乘法原理,伽罗华乘法原理与C语言实现
  13. THREE.JS中常用的3种材质
  14. Eclipse Plungins--Pydev
  15. 永强教你加解密:对称篇(一)
  16. 【计算机网络】第三话·浅谈OSI和TCP/IP模型
  17. wlan源码中Country Code 与 regDomain的对应关系表
  18. FME转换LPK层文件到AUTOCAD报错
  19. ib 盈透数据 matlab,请教下怎样$IB盈透里ES的历史数据
  20. 深入理解字符串的不可变性[java]

热门文章

  1. 分布式检测与数据融合:贝叶斯检测理论
  2. mysql5.7 字符集编码
  3. 【线段树】Interval GCD【线段树维护gcd】
  4. 《Web漏洞防护》读书笔记——第3章,其他注入防护
  5. ios安全机制不支持antofocus
  6. ElasticSearch5.0——IK词库加载
  7. 设计模式-12-命令模式
  8. xtrabackup备份原理
  9. 20145231熊梓宏 《网络对抗》 实验6 信息搜集与漏洞扫描
  10. SQL Server 2005全文索引(full text search)