javaweb学习总结二十三(servlet开发之线程安全问题)

Posted 格物致知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaweb学习总结二十三(servlet开发之线程安全问题)相关的知识,希望对你有一定的参考价值。

一:servlet线程安全问题发生的条件

如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源。如果访问

的不是相同资源,则不存在线程安全问题。

实例1:不会产生线程安全问题,因为每个客户端发送请求,都会创建一个线程,都会创建一个count

不存在资源共享的问题。

1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2             throws ServletException, IOException {
3         int count = 0;
4         count++;
5         response.getOutputStream().write((count + "").getBytes());
6     }

 

实例2:这种方式,多个线程公用资源,应该存在线程安全问题,但是我的测试结果一直不存在线程安全问题。有点不解?

 1 public class ServletDemo extends HttpServlet {
 2 
 3     int count = 0;
 4 
 5     public void doGet(HttpServletRequest request, HttpServletResponse response)
 6             throws ServletException, IOException {
 7         count++;
 8         try {
 9             Thread.sleep(1000 * 10);
10         } catch (InterruptedException e) {
11             e.printStackTrace();
12         }
13         response.getOutputStream().write((count + "").getBytes());
14     }
15 
16 }

 

二:线程安全问题的处理

1:对于线程安全问题最简单的方式就是加锁:

将存在线程安全问题的代码放到同步代码块中,这样线程访问时就需要排队拿到钥匙,只有上一个

线程访问完毕,才会释放掉锁,先一个线程才可以进入。但是存在明显的缺点:就是效率太低了。

例如:门户网站日访问量过千万,效率太低了。

注意:应该尽量减少代码在同步代码块中

1 synchronized (this) {
2             count++;
3             try {
4                 Thread.sleep(1000 * 10);
5             } catch (InterruptedException e) {
6                 e.printStackTrace();
7             }
8             response.getOutputStream().write((count + "").getBytes());
9         }

 

2:实现singleThreadModel接口

servlet实现singleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题

,但是servlet响应客户端请求的效率太低,所以已经淘汰。

以上是关于javaweb学习总结二十三(servlet开发之线程安全问题)的主要内容,如果未能解决你的问题,请参考以下文章

javaweb学习总结二十二(servlet开发中常见的问题汇总)

javaweb学习总结二十四(servlet经常用到的对象)

javaweb学习总结(四十三)——Filter高级开发

JavaWeb学习—Servlet(十三)

JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

javaweb学习总结二十五(response对象的用法一)