成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Servlet多線程的相關問題淺析

開發 后端
Servlet多線程體系結構是建立在Java多線程機制之上的,那么你對其了解多少呢?本文將向你簡單介紹下。

Servlet多線程體系結構是建立在Java多線程機制之上的,它的生命周期是由Web容器負責的。當客戶端第一次請求某個Servlet時,Servlet容器將會根據web.xml配置文件實例化這個Servlet類。當有新的客戶端請求該Servlet時,一般不會再實例化該Servlet類,也就是有多個線程在使用這個實例。 這樣,當兩個或多個線程同時訪問同一個Servlet時,可能會發生多個線程同時訪問同一資源的情況,數據可能會變得不一致。所以在用Servlet構建的Web應用時如果不注意線程安全的問題,會使所寫的Servlet程序有難以發現的錯誤。

實例變量不正確的使用是造成Servlet多線程不安全的主要原因。下面針對該問題給出了三種解決方案并對方案的選取給出了一些參考性的建議。

1、實現 SingleThreadModel

該接口指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不會有兩個線程被同時執行,當然也就不存在線程安全的問題。這種方法只要將前面的Concurrent Test類的類頭定義更改為:

  1. Public class Concurrent Test extends HttpServlet implements SingleThreadModel {  
  2.      …………  
  3. }  

2、同步對共享數據的操作

使用synchronized 關鍵字能保證一次只有一個線程可以訪問被保護的區段,在本論文中的Servlet可以通過同步塊操作來保證線程的安全。同步后的代碼如下:

  1. …………  
  2.  
  3. Public class Concurrent Test extends HttpServlet { …………  
  4.  
  5. Username = request.getParameter ("username");   
  6.  
  7. Synchronized (this){  
  8.  
  9. Output = response.getWriter ();   
  10.  
  11. Try {  
  12.  
  13. Thread. Sleep (5000);  
  14.  
  15. } Catch (Interrupted Exception e){}  
  16.  
  17. output.println("用戶名:"+Username+"  
  18.  
  19. ");   
  20.  
  21. }   
  22.  
  23. }  
  24.  

3、避免使用實例變量

本實例中的Servlet多線程安全問題是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的。

修正上面的Servlet代碼,將實例變量改為局部變量實現同樣的功能,代碼如下:

  1. ……   
  2.  
  3. Public class Concurrent Test extends HttpServlet                                 
  4.  
  5. {                                                                                  public void service (HttpServletRequest request, HttpServletResponse   
  6.  
  7. Response) throws ServletException,IOException                                                                           {  
  8.  
  9. Print Writer output;   
  10.  
  11. String username;  
  12.  
  13. Response.setContentType ("text/html; charset=gb2312");  
  14.  
  15. ……   
  16.  
  17. }   
  18.  

對上面的三種方法進行測試,可以表明用它們都能設計出線程安全的Servlet程序。但是,如果一個Servlet實現了SingleThreadModel接口,Servlet引擎將為每個新的請求創建一個單獨的Servlet多線程實例,這將引起大量的系統開銷。SingleThreadModel在Servlet2.4中已不再提倡使用;同樣如果在程序中使用同步來保護要使用的共享的數據,也會使系統的性能大大下降。這是因為被同步的代碼塊在同一時刻只能有一個線程執行它,使得其同時處理客戶請求的吞吐量降低,而且很多客戶處于阻塞狀態。另外為保證主存內容和線程的工作內存中的數據的一致性,要頻繁地刷新緩存,這也會大大地影響系統的性能。所以在實際的開發中也應避免或最小化 Servlet 中的同步代碼;在Servlet多線程中避免使用實例變量是保證Servlet多線程安全的最佳選擇。從Java 內存模型也可以知道,方法中的臨時變量是在棧上分配空間,而且Servlet多線程中每個線程都有自己私有的棧空間,所以它們不會影響線程的安全。

【編輯推薦】

  1. 什么是Servlet以及常用Servlet API有哪些
  2. JSP Servlet實例之自動跳轉到出錯頁
  3. 優化JSP Servlet應用程序八點雜談
  4. JSP開發中Servlet之導入事件驅動技術
  5. 什么是JSP以及和Servlet的比較
責任編輯:仲衡 來源: CSDN博客
相關推薦

2010-02-01 17:25:09

Python多線程

2009-07-03 16:53:11

Servlet容器

2011-04-08 10:36:38

MFC多線程

2009-07-01 17:34:03

Servlet和JSP

2010-03-16 19:29:26

Java多線程操作

2010-03-16 18:40:59

Java多線程編程

2009-09-01 17:15:42

C#多線程應用

2009-08-12 18:04:44

編寫C#多線程

2009-06-11 11:17:59

Java多線程

2010-03-03 17:44:07

Python多線程

2009-04-27 13:15:04

多線程方法run()

2009-07-09 13:45:06

Servlet基本結構

2009-07-08 10:02:41

Servlet 3.0

2009-07-06 09:23:51

Servlet定義

2010-03-16 10:50:21

Java多線程服務器

2010-03-17 19:24:38

Java多線程循環

2009-08-21 11:31:59

異步和多線程的區別

2009-07-17 17:29:13

多任務多線程

2011-08-29 16:16:22

Lua函數多線程

2011-06-24 11:12:39

Qt 多線程 線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品免费国产一区二区三区 | 欧美一区二区大片 | 午夜精品在线 | 成人精品一区 | 日韩图区 | 九九综合 | 国产精品国产三级国产aⅴ原创 | 在线看av网址 | 日韩成人在线免费观看 | 国产精品久久国产精品99 gif | 久久精品国产亚洲一区二区三区 | 在线观看第一区 | 国产高清一区二区 | 久久tv在线观看 | 欧美在线观看一区 | 毛片高清| 亚洲欧洲一区 | av网站在线播放 | 一区二区三区在线观看免费视频 | 欧美一区2区三区4区公司二百 | 老司机免费视频 | 伊人久久综合 | 欧美精品91 | 国产成人综合在线 | 天天操网 | 91看片网| 青青草一区 | 欧美9999 | 国产精品久久久久久久三级 | 一区二区不卡 | 亚洲国产成人av | 色一级片 | 户外露出一区二区三区 | 午夜小视频在线播放 | 91视频一区| www.中文字幕av| 国产农村妇女毛片精品久久麻豆 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 亚洲中国字幕 | 久久不射网| 欧美精品在欧美一区二区 |