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

全國(guó)咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之Servlet線程安全

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

我們知道,一個(gè)Servlet對(duì)應(yīng)一個(gè)Servlet實(shí)例,也就是說Servlet是單例的,那么就有可能會(huì)出現(xiàn)一個(gè)Servlet同時(shí)處理多個(gè)不同的請(qǐng)求,這時(shí)就可能會(huì)出現(xiàn)線程不安全問題。如何防止出現(xiàn)線程安全問題,有以下三種方法:
  • 不要在Servlet中創(chuàng)建成員變量,可以創(chuàng)建局部變量;
  • 如果要?jiǎng)?chuàng)建成員變量,必須保證是無(wú)狀態(tài)的成員變量;
  • 如果創(chuàng)建的有狀態(tài)的成員變量,狀態(tài)必須是只讀的。
下面我們通過案例來(lái)說明以上兩種方法,具體如下:
  1. 在Servlet中創(chuàng)建無(wú)狀態(tài)的成員變量。
  1. 在web應(yīng)用Example13中新建一個(gè)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類中沒有成員變量,只有一個(gè)say()方法。
  1. 再次新建一個(gè)Servlet,名字為SafeServlet,它有一個(gè)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是無(wú)狀態(tài)的,多個(gè)線程同時(shí)訪問時(shí),不會(huì)出現(xiàn)線程安全問題。
(2)在Servlet中創(chuàng)建狀態(tài)為只讀的成員變量。
  1. 修改User類,為它添加一個(gè)成員,具體代碼如例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方法,那么對(duì)于SafeServlet來(lái)說,它的成員user就是有狀態(tài)的,而且狀態(tài)是只讀的。同一時(shí)刻,多個(gè)線程同時(shí)訪問時(shí),因?yàn)槎贾荒軐?duì)該成員進(jìn)行讀操作,不能進(jìn)行寫操作所以各個(gè)線程之間就不會(huì)互相影響了。





本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee 
0 分享到:
和我們?cè)诰€交談!