servlet執行緒安全

2021-06-16 20:41:42 字數 1593 閱讀 9533

很多情況下,可能會有很多併發的請求,為了提高執行效率,節省記憶體資源,容器採用thread pool. 一般情況下容器只對每個servlet生成乙個例項,讓他服務於說有的請求,對於客戶端同時請求乙個servlet,他們是被併發的處理的,並不是等上乙個請求處理完成再處理下乙個。如果兩個請求同時到達,那麼他們處理完成的時間也是差不多的。

thread safe in servlet

很多情況下,可能會有很多併發的請求,為了提高執行效率,節省記憶體資源,容器採用thread pool.

一般情況下容器只對每個servlet生成乙個例項,讓他服務於說有的請求,對於客戶端同時請求乙個servlet,他們是被併發的處理的,並不是等上乙個請求處理完成再處理下乙個。如果兩個請求同時到達,那麼他們處理完成的時間也是差不多的。

當然有些時候處於併發的同步性考慮,servlet並不適合多執行緒,那麼就可以通過繼承標識介面 singlethreadmodel來實現。這樣的話servlet就不會被多執行緒執行,而是生成他的多個例項來提高效能(注意不是乙個);單執行緒servlet僅僅表示他不會被多執行緒執行,並不能說明它是執行緒安全的。

note:

多執行緒和單執行緒servlet具體區別:多執行緒情況下每個執行緒會儲存例項中的區域性變數的乙個copy,對區域性變數的修改只會影響自己的copy不會影響別的執行緒,所以區域性變數是安全的。但是對於全域性變數,是屬於所有執行緒的。對他的修改會影響到其他的執行緒。而對於單執行緒servlet,會有多個例項,這些例項的變數都是屬於自己的,當然是執行緒安全的,包括全域性和區域性的變數。但是在這兩種情況下static變數都不是執行緒安的。

也可以通過

synchronizing servlet的service()方法來實現同步,但是這種方法不是很有效,比起singlethreadmodel方式來效率要低,所以很少用。原因是,這種方式的servlet在容器中只存在乙個例項,而對於singlethreadmodel方式的會有多個例項同時存在,當然效率上會有差別。

對於context,session,request的執行緒安全問題:

毫無疑問context不是執行緒安全的,而對於session呢?session是被正在處理屬於這個session的執行緒來訪問的,安理說他只會同時被乙個執行緒訪問,應該是執行緒安全的。但是也有特殊情況,如果乙個客戶同時開了多個視窗來同時提交請求的,還會出現多個執行緒同時訪問乙個session的情況。request是執行緒安全的。

小結:

1.設計servlet的時候要考慮執行緒安全的問題。

2.對於單執行緒servlet,要通過singlethreadmodel來實現,不要通過

synchronizing

來實現。

3.singlethreadmodel並不能保證執行緒安全,他只保證不被多執行緒執行。

4.對於context,session的資料修改要考慮同步。或者其他方式來避免執行緒安全問題。

5.servlet中可以把不變常量寫成全域性,或者靜態。

6.對於不想被其他執行緒共同訪問的變數要寫成區域性變數。保證安全。

Servlet 執行緒安全

普通類的靜態屬性,當被多個執行緒訪問時,就有執行緒安全問題 servlet也一樣 當多個客戶端併發訪問同乙個servlet時,web伺服器會為每乙個客戶端的訪問請求建立乙個執行緒,並在這個執行緒上呼叫servlet的service方法,因此service方法內如果訪問了同乙個資源的話,就有可能引發執...

servlet執行緒安全問題

最近在想乙個jsp和servlet的執行緒安全問題。據我現在的理解 servlet中的例項變數是非執行緒安全的 變數在堆上 而service,dopost,doget方法中宣告的變數是執行緒安全的 變數在棧上 web伺服器中只維護乙個servlet的例項,每次客戶端的連線新開乙個執行緒處理。那麼這裡...

設計執行緒安全的Servlet

設計執行緒安全的servlet 例項變數和類變數不正確的使用是造成servlet執行緒不安全的主要原因。1 實現 singlethreadmodel 介面 2 同步對共享資料的操作 使用synchronized 關鍵字能保證一次只有乙個執行緒可以訪問被保護的區段,在本 中的servlet可以通過同步...