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 ...
随机推荐
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
腾讯云图片鉴黄集成到C# 官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...
- mybatis 动态curd
xml <select id="selectByCondition" parameterType="com.oracle.pojo.Student" re ...
- npm 的常用操作
cd 项目目录 npm install -y 初始化信息,-y表示所有的选择都表示确定 执行完之后会自动生成一个package.json文件 添加依赖: npm -i(install) jquery ...
- linux块设备驱动(一)——块设备概念介绍
本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://blog.chinaunix.net/uid-27 ...
- SSM整理笔记3——配置解析
github:https://github.com/lakeslove/SSM 项目的目录结构如下 首先,配置web.xml <?xml version="1.0" enco ...
- 新手必备的SEO优化工具
- leetCode 116.Populating Next Right Pointers in Each Node (为节点填充右指针) 解题思路和方法
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- Java中的final具体解释以及用途实战
浅析Java中的finalkeyword 谈到finalkeyword,想必非常多人都不陌生.在使用匿名内部类的时候可能会经经常使用到finalkeyword. 另外.Java中的String类就是一 ...
- 今日头条上看到的js面试题和答案
用js判断字符中每个字符出现的次数, 答案是var info = arr.split('').reduce((a,b)=>(console.log(a,b),a[b]++ || (a[b]=1) ...
- window10 java 环境变量配置
JAVA_HOME (可有可无) CLASSPATH : C:\Program Files\Java\jdk1.8.0_91\lib\dt.jar;C:\Program Files\Java\j ...