对于前面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同步机制对多线程同步的更多相关文章

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

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

  2. 【死磕线程】线程同步机制_java多线程之线程锁

    1.线程各种状态间的切换,用图表示的话简单清晰: 图出处:https://www.cnblogs.com/bhlsheji/p/5099362.html(博主对每个状态解释的清晰明了) 2.为什么需要 ...

  3. Java高级教程:Java并发性和多线程

    Java并发性和多线程: (中文,属于人工翻译,高质量):http://ifeve.com/java-concurrency-thread-directory/ (英文):http://tutoria ...

  4. IT兄弟连 JavaWeb教程 MVC设计模式

    MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它强制性地把应用程序的数据展示.数据处理和流程控制分开.MVC把应用程序分成3个核心模块:模型.视 ...

  5. IT兄弟连 JavaWeb教程 文件下载技术

    ●  列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...

  6. IT兄弟连 JavaWeb教程 文件上传技术

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参 ...

  7. IT兄弟连 JavaWeb教程 监听器4

    感知Session绑定事件的监听器 保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中:从 ...

  8. IT兄弟连 JavaWeb教程 监听器3

    监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession.HttpServletRequest这三个对象中的属性变更信息事件的监听器 ...

  9. IT兄弟连 JavaWeb教程 监听器2

    4  监听HttpSession域对象的创建和销毁 HttpSessionListener接口用于监听HttpSession对象的创建和销毁. 创建一个Session时,激发sessionCreate ...

随机推荐

  1. 关于颜色(color、background)

    CSS3 HSL colors使用参考指南语法:<length> || <percentage> || <percentage>取值:<length> ...

  2. 【转载】分布式RPC框架性能大比拼

    dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...

  3. android-custom-tab-with-viewpager

    https://github.com/eltld/android-custom-tab-with-viewpager

  4. 第六十题(在O(1)时间内删除链表结点)

    题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 思路:将待删除节点下一个节点的数据赋给当前节点.删除下一个节点就可以.

  5. 进程-IPC 管道 (一)

    详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%80).md 一 IPC 概述 进程间通信就是在不同进程之间传播或交换信 ...

  6. Arcgis Engine(ae)接口详解(5):IGeometry几何基础操作

    //点操作~~~~~~~~~~~~~~~~~~~~~~~~~ //通过坐标生成点 IPoint point = new PointClass(); point.PutCoords(, ); //获取点 ...

  7. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...

  8. weblogic启动后 登陆控制台特别慢的问题

    weblogic官方文档给出的问题原因: 江湖偏方: 修改jdk:修改$JAVA_HOME/jre/lib/security/java.security文件,替换securerandom.source ...

  9. (linux)tasklet

      tasklet Tasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联 例子: Void my_tasklet_func(unsigned long) DECLARE_TA ...

  10. jvm虚拟机配置 深度好文

    http://blog.csdn.net/kthq/article/details/8618052