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

Servlet容器之安全多線程問題

開發 后端
Servlet容器如何實現多線程。其安全的方面又是如何呢?那么本文將就Servlet容器實現多線程給你做簡單的介紹。

一,Servlet容器如何同時處理多個請求。

Servlet采用多線程來處理多個請求同時訪問,Servelet容器維護了一個線程池來服務請求。

線程池實際上是等待執行代碼的一組線程叫做工作者線程(WorkerThread),Servlet容器使用一個調度線程來管理工作者線程(DispatcherThread)。

當容器收到一個訪問Servlet的請求,調度者線程從線程池中選出一個工作者線程,將請求傳遞給該線程,然后由該線程來執行Servlet的service方法。

當這個線程正在執行的時候,容器收到另外一個請求,調度者線程將從池中選出另外一個工作者線程來服務新的請求,容器并不關系這個請求是否訪問的是同一個Servlet還是另外一個Servlet。

當容器同時收到對同一Servlet的多個請求,那這個Servlet的service方法將在多線程中并發的執行。

二,Servlet容器默認采用單實例多線程的方式來處理請求,這樣減少產生Servlet實例的開銷,提升了對請求的響應時間。對于Tomcat可以在server.xml中通過<Connector>元素設置線程池中線程的數目。

就實現來說:

調度者線程類所擔負的責任如其名字,該類的責任是調度線程,只需要利用自己的屬性完成自己的責任。所以該類是承擔了責任的,并且該類的責任又集中到***的單體對象中。

而其他對象又依賴于該特定對象所承擔的責任,我們就需要得到該特定對象。那該類就是一個單例模式的實現了。

三,如何開發線程安全的Servlet

1,變量的線程安全:這里的變量指字段和共享數據(如表單參數值)。

a,將參數變量本地化。多線程并不共享局部變量.所以我們要盡可能的在servlet中使用局部變量。

例如:

  1. Stringuser="";  
  2. user=request.getParameter("user"); 

b,使用同步塊Synchronized,防止可能異步調用的代碼塊。這意味著線程需要排隊處理。

在使用同板塊的時候要盡可能的縮小同步代碼的范圍,不要直接在sevice方法和響應方法上使用同步,這樣會嚴重影響性能。

2,屬性的線程安全:ServletContext,HttpSession,ServletRequest對象中屬性

ServletContext:(線程是不安全的)

ServletContext是可以多線程同時讀/寫屬性的,線程是不安全的。要對屬性的讀寫進行同步處理或者進行深度Clone()。

所以在Servlet上下文中盡可能少量保存會被修改(寫)的數據,可以采取其他方式在多個Servlet中共享,比方我們可以使用單例模式來處理共享數據。

HttpSession:(線程是不安全的)

HttpSession對象在用戶會話期間存在,只能在處理屬于同一個Session的請求的線程中被訪問,因此Session對象的屬性訪問理論上是線程安全的。

當用戶打開多個同屬于一個進程的瀏覽器窗口,在這些窗口的訪問屬于同一個Session,會出現多次請求,需要多個工作線程來處理請求,可能造成同時多線程讀寫屬性。

這時我們需要對屬性的讀寫進行同步處理:使用同步塊Synchronized和使用讀/寫器來解決。

ServletRequest:(線程是安全的)

對于每一個請求,由一個工作線程來執行,都會創建有一個新的ServletRequest對象,所以ServletRequest對象只能在一個線程中被訪問。ServletRequest是線程安全的。

注意:ServletRequest對象在service方法的范圍內是有效的,不要試圖在service方法結束后仍然保存請求對象的引用。

3,使用同步的集合類:

使用Vector代替ArrayList,使用Hashtable代替HashMap。

4,不要在Servlet中創建自己的線程來完成某個功能。

Servlet本身就是多線程的,在Servlet中再創建線程,將導致執行情況復雜化,出現多線程安全問題。

5,在多個servlet中對外部對象(比方文件)進行修改操作一定要加鎖,做到互斥的訪問。

四,SingleThreadModel接口

javax.servlet.SingleThreadModel接口是一個標識接口,如果一個Servlet實現了這個接口,那Servlet容器將保證在一個時刻僅有一個線程可以在給定的servlet實例的service方法中執行。將其他所有請求進行排隊。

服務器可以使用多個實例來處理請求,代替單個實例的請求排隊帶來的效益問題。服務器創建一個Servlet類的多個Servlet實例組成的實例池,對于每個請求分配Servlet實例進行響應處理,之后放回到實例池中等待下此請求。這樣就造成并發訪問的問題。

此時,局部變量(字段)也是安全的,但對于全局變量和共享數據是不安全的,需要進行同步處理。而對于這樣多實例的情況SingleThreadModel接口并不能解決并發訪問問題。

SingleThreadModel接口在servlet規范中已經被廢棄了。

【編輯推薦】

  1. JSP Servlet實例之自動跳轉到出錯頁
  2. 優化JSP Servlet應用程序八點雜談
  3. JSP Servlet技術之表單數據淺析
  4. JSP Servlet開發最初那點事
  5. Java Servlet API文檔實用說明
責任編輯:仲衡 來源: CSDN博客
相關推薦

2009-07-03 17:18:34

Servlet多線程

2009-07-01 17:34:03

Servlet和JSP

2009-07-03 18:13:28

Servlet線程安全

2012-06-05 02:12:55

Java多線程

2009-03-12 10:52:43

Java線程多線程

2011-06-22 14:38:09

QT 多線程 線程安全

2009-07-03 18:14:27

Servlet線程安全

2022-03-31 15:17:04

JavaSocketServlet容器

2010-02-01 17:25:09

Python多線程

2009-07-07 13:29:33

Servlet和JSP

2023-06-07 13:49:00

多線程編程C#

2011-06-13 10:41:17

JAVA

2019-09-26 10:19:27

設計電腦Java

2009-07-09 11:27:59

Servlet容器

2009-07-03 14:02:51

2009-08-17 16:56:51

C#多線程控制進度條

2021-03-05 07:38:52

C++線程編程開發技術

2022-10-11 08:37:43

Servlet配置版本

2013-05-23 15:59:00

線程池

2011-06-22 16:02:37

Qt 多線程 重入
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲激情在线视频 | 国产精品久久久久久久久大全 | 国产精品视频一二三区 | 亚洲一区二区 | 久久精品一区 | 国产农村妇女毛片精品久久麻豆 | 国产一区三区视频 | 欧洲成人午夜免费大片 | 精品免费在线 | 国产精品一区二区免费 | 成人在线视频网站 | 日韩午夜精品 | 欧美日韩在线一区二区三区 | av色站| 久草热在线 | 成人在线免费视频 | 日韩在线视频播放 | 密桃av| 欧美 日韩 亚洲91麻豆精品 | 久久久国产精品一区 | 中文字幕欧美在线观看 | 国产精品99久久久久久www | 欧美一区二区三区久久精品 | 日韩欧美在线不卡 | 国产在线视频一区 | 97人澡人人添人人爽欧美 | 精品九九 | 亚洲天堂久久新 | 亚洲精品一区二区三区四区高清 | 国产99视频精品免费播放照片 | 亚洲精品一区二区三区中文字幕 | 日韩中文字幕视频在线 | 天天色av | 欧美日韩在线观看视频 | 99久久日韩精品免费热麻豆美女 | 91一区二区三区在线观看 | 91色视频在线 | 91综合网| 正在播放国产精品 | 国产精品久久一区二区三区 | 黄色一级电影在线观看 |