Java-Servlet线程安全问题

问题描述

在看zwchen很久之前的一篇博客,地址如下http://zwchen.iteye.com/blog/91088做了个测试,按照第一种做法 为使用synchronized,并未出现 线程共享情况,(我使用的是tomcat6.0带的servlet包)数据都是 SimpleServlet@c4fe76 ==> Thread[http-8080-1,5,main]: Counter = 60Counter = 61Counter = 62Counter = 63Counter = 64Counter = 65Counter = 66Counter = 67Counter = 68Counter = 69 SimpleServlet@c4fe76 ==> Thread[http-8080-1,5,main]: Counter = 70Counter = 71Counter = 72Counter = 73Counter = 74Counter = 75Counter = 76Counter = 77Counter = 78Counter = 79 SimpleServlet@c4fe76 ==> Thread[http-8080-1,5,main]: Counter = 80Counter = 81Counter = 82Counter = 83Counter = 84Counter = 85Counter = 86Counter = 87Counter = 88Counter = 89 正常输出。 请问各位高手,这个是为什么??  还有,其中的synchronized (mutex)  为什么要用mutex这个参数? 我认为synchronized的参数是表明同步的是哪块,所以我改成  我自己servlet中的req,也可以正常跑 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException       {   synchronized (req)   另外 ,最关键的:Thread.sleep((long) Math.random() * 1000);我改成Thread.sleep(1000);,输出的结果就好像是线程共享了??   SimpleServlet@64883c ==> Thread[http-8080-3,5,main]: Counter = 4Counter = 6Counter = 10Counter = 14Counter = 18Counter = 22Counter = 26Counter = 30Counter = 34Counter = 38  SimpleServlet@64883c ==> Thread[http-8080-6,5,main]: Counter = 4Counter = 7Counter = 11Counter = 15Counter = 19Counter = 23Counter = 27Counter = 31Counter = 35Counter = 39 SimpleServlet@64883c ==> Thread[http-8080-7,5,main]: Counter = 4Counter = 8Counter = 12Counter = 16Counter = 20Counter = 24Counter = 28Counter = 32Counter = 36Counter = 40  下面附上  ZWCHEN先生的原文,并对他表示深深的敬意,谢谢!Java代码

解决方案

1,synchronized(mutex)与synchronized(this)在这里是一样的,因为mutex是实例变量;2,{}里面到代码每次只能有一个线程执行
解决方案二:
1,线程安全问题导致的现象是不确定的,有线程安全问题的代码不一定每次跑都会出现问题;2,synchronized(obj){},是获取对象obj的对象锁,{}中的代码一次只可以一个线程访问,文中的mutex是Servlet的实例变量,所以当前servlet的所有http处理线程都会在这里同步;3,synchronized(req)是没有意义的,因为每个http请求Servlet容器都会独立创建一个HttpServletRequest,它不被其他的http线程共享;4,你的“最关键的:”里面的sleep代码和是否线程安全没关系,原文作者让每个http线程sleep一个随机的时间间隔是为了模拟Http请求处理的不确定的时延
解决方案三:
synchronized 是指需要排队访问对象。被synchronized 的对象、方法,有任何对象访问时,需要排队。现在在多线程中共享的时mutex,由于多个线程同时访问,造成了并发问题。对request synchronized 是指有多个对象同时处理同时处理同一个reqeust时需要排队。但是同一页面上发起多个请求,生成的request不是同一个,当然synchronized也没用
解决方案四:
你的问题太长,没耐心看了。我纯粹路过

时间: 2024-07-31 23:45:46

Java-Servlet线程安全问题的相关文章

Java中线程安全问题个人理解

线程安全问题是一个比较高深的问题,是很多程序员比较难掌握的一个技术难点,如果一个程序员对线程掌握的很好的话,那么这个程序员的内功修炼的是相当的好. 在这里我主要说一下我对java中如何保证线程安全的一些个人见解,希望对各位有所帮助,那里有不对的地方敬请给位不吝赐教. 线程安全问题主要出现在访问临界资源的时候,就是访问同一个对象的时候,可能会出现无法挽回的损失,特别是在关于资金安全方面的时候,当然还有数据库事务方面的问题.他们很类似,都是要保证数据的原子性. 那么在java中如何保证线程安全呢?

Java ThreadLocal 线程安全问题解决方案_java

一.线程安全问题产生的原因 线程安全问题都是由全局变量及静态变量引起的 二.线程安全问题 SimpleDateFormate sdf = new SimpleDateFormat();使用sdf.parse(dateStr);sdf.format(date);在sdf内有一个对Caleadar对象的引用,在源码sdf.parse(dateStr);源码中calendar.clear();和calendar.getTime(); // 获取calendar的时间 如果 线程A 调用了 sdf.pa

Servlet和JSP的线程安全问题

js|servlet|安全|问题 编写Servlet和JSP的时候,线程安全问题很容易被忽略,如果忽视了这个问题,你的程序就存在潜在的隐患. 1.Servlet的生命周期 Servlet的生命周期是由Web容器负责的,当客户端第一次请求Servlet时,容器负责初始化Servlet,也就是实例化这个Servlet类.以后这个实例就负责客户端的请求,一般不会再实例化其他Servlet类,也就是有多个线程在使用这个实例.Servlet之所以比CGI效率高就是因为Servlet是多线程的.如果该Ser

java初学者求教:关于线程安全问题

问题描述 java初学者求教:关于线程安全问题 List list = new ArrayList(); list = Collections.synchronizedList(list); 这时list是线程安全的,那么当我用增强for循环遍历list, 并且使用list的remove方法时,是不是就不安全了? 另外,如果list集合中存放的是一些带有图片的对象,比如dog public void paintTest(Graphisc g){ for(dog d:list){ g.drawIm

Java中静态方法的线程安全问题

问题描述 Java中静态方法的线程安全问题 Java中多个线程同时访问一个静态方法是否存在线程安全问题? 比如以下代码,两个线程同时对方法中b修改不同的值,会有线程安全问题吗? new Thread(new Runnable() { @Override public void run() { fun(0); } }).start(); new Thread(new Runnable() { @Override public void run() { fun(1); } }).start(); }

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

一.Servlet映射匹配问题: 在第一篇文章中的第四段(MyEclipse及Tomcat的配置)已经讲到这个知识,现在再细化一下: 由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成. <servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-n

Servlet网上售票问题引发线程安全问题的思考_JSP编程

先分享相关代码: package com.lc.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServlet

Java日期类SimpleDateFormat时间格式化线程安全问题

SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题.下面我们通过一个具体的场景来一步步的深入学习和理解SimpleDateFormat类.     一.引子     我们都是优秀的程序员,我们都知道在程序中我们应当尽量

实例解析Java中的synchronized关键字与线程安全问题_实用技巧

首先来回顾一下synchronized的基本使用: synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步.这叫减小锁的粒度,使代码更大程度的并发. synchronized方法,被修饰的方法成为同步方法,其作用范围是整个方法,作用对象是调用这个方法的对象. synchronized静态方法,修饰一个static静态方法,其作用范围是整个

深入研究Servlet线程安全性问题

摘要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍. 关键字:Servlet 线程安全 同步 Java内存模型 实例变量 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题.然而,很多人编写Servlet/JS