我們知道,一個Servlet對應一個Servlet實例,也就是說Servlet是單例的,那么就有可能會出現(xiàn)一個Servlet同時處理多個不同的請求,這時就可能會出現(xiàn)線程不安全問題。如何防止出現(xiàn)線程安全問題,有以下三種方法:
- 不要在Servlet中創(chuàng)建成員變量,可以創(chuàng)建局部變量;
- 如果要創(chuàng)建成員變量,必須保證是無狀態(tài)的成員變量;
- 如果創(chuàng)建的有狀態(tài)的成員變量,狀態(tài)必須是只讀的。
下面我們通過案例來說明以上兩種方法,具體如下:
- 在Servlet中創(chuàng)建無狀態(tài)的成員變量。
- 在web應用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()方法。
- 再次新建一個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)為只讀的成員變量。
- 修改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)是只讀的。同一時刻,多個線程同時訪問時,因為都只能對該成員進行讀操作,不能進行寫操作所以各個線程之間就不會互相影響了。
本文版權歸傳智播客Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://xamj520.com/javaee