问题描述
在看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也没用
解决方案四:
你的问题太长,没耐心看了。我纯粹路过