我们访问一个web应用系统的流程一般是这样的:
1.用户输入相应的url地址,web容器首先接受到了用户的请求。然后根据加载的web.xml中映射的地址把请求的参数封装到相应的对象中,然后以方法参数的方式传递给应用程序。
2.应用程序接受到了参数进行一系列的逻辑处理然后再返回给用户。
这个过程基本上所有的java开发人员都很熟悉。我以前对于网上说的一些结论不是很好的能理解。结论如下:
1.Servlet是线程不安全的
2.Servlet是单例的
以前没有仔细去思考这些,只是把结论记住了。今天来好好分析和梳理下为什么是这样的。
什么是线程安全的,网上答案很多。其中有一个比较重要:局部变量。局部变量是各个线程私有的。也就是通常所说的线程安全的。为什么呢?因为局部变量是在方法中定义的变量。局部变量保存在栈区中。
根据上面的jvm内存结构说明可以看出,栈区是每个线程私有的。所以局部变量才能保证是线程安全的。
而方法的参数同样是每个线程私有的。
理解了上面的原理,再来想想我们平时的web项目。在使用了mvc框架的时候,一般习惯的写法都是:
controller层把service层的变量定义成成员变量、service层把dao层的变量定义成成员变量。然后使用spring的注入方式去实例化成员变量。而且需要注意的是:serlvet并不是每次都创建一个新的对象的,在web容器中使用了单例模式。spring实例化类的时候如果没有特殊配置,默认也是单例模式的。
这样问题就出现了:成员变量不是线程安全的,但为什么我们在编写web项目的时候都这样写呢?单例本身有可能会造成线程不安全为什么web容器和spring都会使用呢?
我的理解是:单例虽然可能线程不安全,但是性能要高。因为只创建了一个对象。然后再仔细想想我们的使用过程,spring注入bean之后我们一直在使用很少去修改。再想想什么情况下会产生并发问题:当多个线程对同一资源进行变更的时候会出现问题。如果多个线程对同一个资源只是读取是不会有任何问题的。所以我们这样的编写习惯是不会产生并发问题的。
当然如果自己去定义成员变量,要对成员变量去变更操作的话。还是需要考虑并发问题的。
相关推荐
科技申报项目写法.pptx
一个关于中国各类科研基金项目中英文翻译名称写法的整理文档,希望对大家有帮助。
在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序,包括WebAPI服务。WebAPI是ASP.NET框架的一部分,允许开发人员构建RESTful服务,这些服务可以接收和响应HTTP请求,通常用于创建数据驱动的Web应用。在...
8. 事件处理:使用 `onclick` 属性时必须和 `onkeypress` 属性成对出现。 9. URL 传值:使用 `&` 替换 `&` 传值。 四、缩近规则 缩近规则是指编写 HTML 代码时的缩进格式,以 `Tab` 键为准,保持代码的美观和...
"项目章程的具体写法,里面有表格" 项目章程是项目管理中的一份重要文件,用于记录和指导项目的实施过程。下面是项目章程的具体写法,包括标题、描述、标签和部分内容。 一、项目章程的标题 项目章程的标题通常...
SSH,全称Spring、Struts...总的来说,这个SSH项目实例是一个实用的学习和参考工具,涵盖了Java Web开发中的关键技术和最佳实践。通过对不同模板的探索和实践,开发者能够提升自己的技能,更好地应对实际项目中的挑战。
弄了三种webServer的写法,简单、复杂的,感觉国外这个开源的最好。 我在他基础上测试了通过网页调用串口。 网页本身是不能控制串口的,这样调用: 在js里这样调用: http://127.0.0.1:8080?method=gaizhang 这个cs...
通过这样的结构,你可以创建一个灵活且可扩展的构建系统,方便管理和维护大型项目。确保每个Makefile都明确其职责,保持代码清晰,并利用Makefile.build来实现代码复用,这将大大提高开发效率。同时,良好的文档(如...
Bootstrap 是一个流行的前端框架,用于构建响应式、mobile-first 的 Web 应用程序。它提供了一些常用的 HTML、CSS 和 JavaScript 组件,可以快速构建现代化的 Web 应用程序。Bootstrap 的主要特点是响应式设计,可以...
一年级数学日记的写法.pdf
在SQL查询中,`GROUP BY`语句是一个非常重要的部分,它用于对数据进行分组,以便我们可以对每个组执行聚合函数(如COUNT、SUM、AVG、MAX、MIN等)。`GROUP BY`通常的写法是直接指定需要分组的列名。然而,还有其他...
在“Delegation委托写法项目实例”中,通过实践自定义方法的委托调用,你将更熟练地掌握这一重要技巧。通过学习和分析压缩包中的"DelegationClass",你可以深化对委托的理解,并将其应用到实际的开发工作中。
在web前端开发中,创建一个音乐播放器网页是一项常见的任务,它涉及到HTML、CSS和JavaScript等核心技术。HTML用于构建页面的基本结构,CSS负责样式和布局,而JavaScript则为页面添加交互性和动态功能,如播放、暂停...
5. **web**:这是“Web”的另一种写法,再次确认项目的Web背景。 【压缩包子文件的文件名称列表】仅列出了一项 "jsp_web",这可能是项目的源代码目录或者包含JSP文件的主文件夹。通常,一个JSP项目会包含多个JSP...
在探讨C#中的委托及其不同写法之前,我们先来简要回顾一下委托的基本概念...此外,还介绍了一种使用Lambda表达式的简化写法,使代码更加简洁高效。通过理解和掌握这些技术,开发者可以更好地应对复杂的多线程编程场景。
关于网站项目策划书的写法
make写法
HTML5是第五代超文本标记语言,主要用于Web内容的展示,它是构建Web应用程序的基础。HTML5相较于之前的...对于初学者来说,掌握HTML5的基础写法是学习前端开发的第一步,也是构建网页和Web应用不可或缺的基本技能。
Struts2是一个强大的MVC框架,它极大地简化了Java Web应用程序的开发。在Struts2中,标签库是其核心特性之一,它提供了一系列预定义的JSP标签,用于简化视图层的开发,使代码更加简洁、易读。本文将深入探讨Struts2...
易语言写法