关于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!!!");
    }

JAVAEE_Servlet_18_关于Servlet线程安全问题的更多相关文章

  1. javaweb回顾第六篇谈一谈Servlet线程安全问题

    前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例 ...

  2. Servlet线程安全问题(转载)

    转载地址:https://www.cnblogs.com/LipeiNet/p/5699944.html 前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安 ...

  3. Servlet线程安全问题

    Servlet采用单实例多线程方式运行,因此是线程不安全的.默认情况下,非分布式系统,Servlet容器只会维护一个Servlet的实例,当多个请求到达同一个Servlet时,Servlet容器会启动 ...

  4. (2.1)servlet线程安全问题

    本文参考链接:http://www.yesky.com/334/1951334.shtml 摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安 ...

  5. 开玩笑Web它servlet(五岁以下儿童)---- 如何解决servlet线程安全问题

    servlet默认值是安全线的存在,但说白,servlet安全线实际上是一个多线程线程安全问题.因为servlet它正好是一个多线程的安全问题出现. 每次通过浏览器http同意提交请求,将一个实例se ...

  6. IT兄弟连 JavaWeb教程 Servlet线程安全问题

    在Internet中,一个Web应用可能被来自西面八方的客户并发访问(即同时访问),而且有可能这些客户并发访问的是Web应用中的同一个Servlet,Servlet容器为了保证能同时相应多个客户端要求 ...

  7. javaweb学习总结二十三(servlet开发之线程安全问题)

    一:servlet线程安全问题发生的条件 如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源.如果访问 的不是相同资源,则不存在线程安全问题. 实例1:不会产生线程 ...

  8. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...

  9. 玩转Web之servlet(五)---- 怎样解决servlet的线程安全问题

    servlet默认是存在线程安全问题的,但是说白了,servlet的线程安全问题实际上就是多线程的线程安全问题,因为servlet恰巧是一个多线程才会出现安全性问题. 浏览器每次通过http协议去提交 ...

随机推荐

  1. Redis高频面试题总结

    通过面试多家大型互联网企业,总结了如下的高频面试题目: 1.redis 过期键的删除策略? (1)定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即 ...

  2. VUE实现富文本编辑以及组件传值的使用总结

    VUE实现使用富文本编辑,如下图: 实现这个富文本编辑需要以下步骤: 第一步:安装编辑器组件 npm install vue-quill-editor –-save第二步:创建一个Ue.vue的文件, ...

  3. docker轻量级监控-sysdig

    sysdig Sysdig = system(系统)+dig(挖掘).Sysdig 是一个开源系统发掘工具,用于系统级别的勘察和排障,可以把它看作一系列Linux系统工具的组合,主要包括: strac ...

  4. Kubernetes-7.Ingress

    docker version:20.10.2 kubernetes version:1.20.1 本文概述Kubernetes Ingress基本原理和官方维护的Nginx-Ingress的基本安装使 ...

  5. es6 快速入门 系列 —— 变量声明:let和const

    其他章节请看: es6 快速入门 系列 变量声明:let和const 试图解决的问题 经典的 var 声明让人迷惑 function demo1(v){ if(v){ var color='red' ...

  6. Service Cloud 零基础(五)Trailhead学习 Embedded Chat

    本篇参考:https://trailhead.salesforce.com/content/learn/modules/web-chat 想一下我们为什么要用service cloud呢?为什么要有s ...

  7. 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序

    剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...

  8. 10个顶级Python实用库,推荐你试试!

    为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行. 在本文中,我挑选了15个最有用 ...

  9. 不用任何框架,Java 就能实现定时任务的 3 种方法!

    是的,不用任何框架,用我们朴素的 Java 编程语言就能实现定时任务. 今天,栈长就介绍 3 种实现方法,教你如何使用 JDK 实现定时任务! 1. sleep 这也是我们最常用的 sleep 休眠大 ...

  10. rest framework Genericview

    通用视图 Django的通用视图...被开发为普通使用模式的快捷方式......他们采取某些共同的习惯和模式的发展观和抽象,从而使您可以快速地将数据写入的共同看法,而不必重复自己发现的. - Djan ...