教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓之Servlet線程安全

更新時間:2016年04月26日15時17分 來源:傳智播客Java培訓學院 瀏覽次數(shù):

我們知道,一個Servlet對應(yīng)一個Servlet實例,也就是說Servlet是單例的,那么就有可能會出現(xiàn)一個Servlet同時處理多個不同的請求,這時就可能會出現(xiàn)線程不安全問題。如何防止出現(xiàn)線程安全問題,有以下三種方法:
  • 不要在Servlet中創(chuàng)建成員變量,可以創(chuàng)建局部變量;
  • 如果要創(chuàng)建成員變量,必須保證是無狀態(tài)的成員變量;
  • 如果創(chuàng)建的有狀態(tài)的成員變量,狀態(tài)必須是只讀的。
下面我們通過案例來說明以上兩種方法,具體如下:
  1. 在Servlet中創(chuàng)建無狀態(tài)的成員變量。
  1. 在web應(yīng)用Example13中新建一個User.java類,具體代碼如例1-1所示:
例1-1 User.java
package cn.itcast.domain;
public class User {
public void say(){
    System.out.println("hello world!");
}
}
例1-1所示,User類中沒有成員變量,只有一個say()方法。
  1. 再次新建一個Servlet,名字為SafeServlet,它有一個User類型的成員變量,如例1-2所示:
例1-2 SafeServlet.java
import cn.itcast.domain.User;
public class SafeServlet  extends HttpServlet {
    private User user=new User();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
               doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
    }
}
例1-2中,SafeServlet中雖然有成員變量user,但是User類中并沒有成員變量,所以稱user是無狀態(tài)的,多個線程同時訪問時,不會出現(xiàn)線程安全問題。
(2)在Servlet中創(chuàng)建狀態(tài)為只讀的成員變量。
  1. 修改User類,為它添加一個成員,具體代碼如例1-3所示:
例1-3 User.java
package cn.itcast.servlet;
public class User {
    private String name="zhangsan";
public String getName() {
       return name;
    }
public void say(){
    System.out.println("hello world!");
}
}
例1-3中,User類有了成員變量,而且為該成員變量提供了get方法,那么對于SafeServlet來說,它的成員user就是有狀態(tài)的,而且狀態(tài)是只讀的。同一時刻,多個線程同時訪問時,因為都只能對該成員進行讀操作,不能進行寫操作所以各個線程之間就不會互相影響了。





本文版權(quán)歸傳智播客Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://oisangadgets.com/javaee 
0 分享到:
和我們在線交談!