IT兄弟连 JavaWeb教程 使用Java同步机制对多线程同步
对于前面AdderServlet案例,它的sum实例变量用来累计客户端请求进行加法运算的和。sum变量的初始为100,如果第一个客户请求加上100,那么sum变量变为200,接着第二个客户请求加上200,那么sum变量变400,HTTP请求和线程,以及HTTP请求和sum变量之间存在以下对应关系:
一个HTTP请求对应一个工作线程。
所有HTTP请求对应同一个sum变量。
由此可以推断出,所有的工作线程对应同一个sum变量,因此AdderServlet把sum变量定义为实例变量时合理的。当多个线程同时操作一个AdderServlet对象的sum实例变量时,如何避免并发问题呢?此时应该采用Java语言提供的同步机制。下面的示例AdderServlet2的service()方法把访问sum实例变量的代码块作为同步代码块来处理。
public class AdderServlet2 extends HttpServlet{
private int sum = 100;
public void service()throws ServletException,IOException{
int increase = Integer.parseInt(request.getParameter("increase"));
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
synchronized(this){
out.println(sum + "+" + increase + "=");
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
sum+=increase;
out.println(sum);
}
out.close();
}
}
在web.xml文件中为AdderServlet2映射的URL为"/adder2",通过两个浏览器同时访问AdderServlet2,两个浏览器都会得到与当前请求匹配的响应结果。
Java同步机制确保在任意时刻,只允许有一个工作线程执行AdderServlet2对象的service()方法中的同步代码块。只有当这个工作线程退出同步代码块时,其他工作线程才允许执行同步代码块,这使得任意时刻不会有两个线程同时操纵同一个AdderServlet对象的sum实例变量,因此就能避免并发问题。
IT兄弟连 JavaWeb教程 使用Java同步机制对多线程同步的更多相关文章
- IT兄弟连 JavaWeb教程 Servlet线程安全问题
在Internet中,一个Web应用可能被来自西面八方的客户并发访问(即同时访问),而且有可能这些客户并发访问的是Web应用中的同一个Servlet,Servlet容器为了保证能同时相应多个客户端要求 ...
- 【死磕线程】线程同步机制_java多线程之线程锁
1.线程各种状态间的切换,用图表示的话简单清晰: 图出处:https://www.cnblogs.com/bhlsheji/p/5099362.html(博主对每个状态解释的清晰明了) 2.为什么需要 ...
- Java高级教程:Java并发性和多线程
Java并发性和多线程: (中文,属于人工翻译,高质量):http://ifeve.com/java-concurrency-thread-directory/ (英文):http://tutoria ...
- IT兄弟连 JavaWeb教程 MVC设计模式
MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它强制性地把应用程序的数据展示.数据处理和流程控制分开.MVC把应用程序分成3个核心模块:模型.视 ...
- IT兄弟连 JavaWeb教程 文件下载技术
● 列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...
- IT兄弟连 JavaWeb教程 文件上传技术
在Web应用系统开发中,文件上传和下载功能是非常常用的功能. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参 ...
- IT兄弟连 JavaWeb教程 监听器4
感知Session绑定事件的监听器 保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中:从 ...
- IT兄弟连 JavaWeb教程 监听器3
监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession.HttpServletRequest这三个对象中的属性变更信息事件的监听器 ...
- IT兄弟连 JavaWeb教程 监听器2
4 监听HttpSession域对象的创建和销毁 HttpSessionListener接口用于监听HttpSession对象的创建和销毁. 创建一个Session时,激发sessionCreate ...
随机推荐
- 关于颜色(color、background)
CSS3 HSL colors使用参考指南语法:<length> || <percentage> || <percentage>取值:<length> ...
- 【转载】分布式RPC框架性能大比拼
dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...
- android-custom-tab-with-viewpager
https://github.com/eltld/android-custom-tab-with-viewpager
- 第六十题(在O(1)时间内删除链表结点)
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 思路:将待删除节点下一个节点的数据赋给当前节点.删除下一个节点就可以.
- 进程-IPC 管道 (一)
详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%80).md 一 IPC 概述 进程间通信就是在不同进程之间传播或交换信 ...
- Arcgis Engine(ae)接口详解(5):IGeometry几何基础操作
//点操作~~~~~~~~~~~~~~~~~~~~~~~~~ //通过坐标生成点 IPoint point = new PointClass(); point.PutCoords(, ); //获取点 ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...
- weblogic启动后 登陆控制台特别慢的问题
weblogic官方文档给出的问题原因: 江湖偏方: 修改jdk:修改$JAVA_HOME/jre/lib/security/java.security文件,替换securerandom.source ...
- (linux)tasklet
tasklet Tasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联 例子: Void my_tasklet_func(unsigned long) DECLARE_TA ...
- jvm虚拟机配置 深度好文
http://blog.csdn.net/kthq/article/details/8618052