關於struts 1 中的執行緒問題

2021-08-29 22:11:45 字數 1176 閱讀 4393

今天突然發現幾個月前寫的**中的乙個執行緒問題.在這裡做個筆記:

因為在struts1中在整個web生命週期中,web伺服器只為每個action產生乙個例項,所以就會產生執行緒問題,就必須要編寫執行緒安全的**.

需求是這樣,簡單的來說我需要儲存乙個學生的一些資訊,但之前我需要載入這個學生相關的一些資訊,資訊量很大,然後在這些資訊中篩選出需要的儲存起來.關鍵在於這個載入的過程,因為資訊量比較大所以我想怎麼能夠盡量提高它的效率.

我最開始的想法:能夠在使用者進入儲存頁面的時候先預先把學生資訊載入好,然後使用者在儲存的時候就能夠只做儲存的事情,也就是把本來該乙個動作做的事情分開城兩個動作來做.這樣來提公升使用者的體驗.

service層中的**:

這樣的話不會每次載入學生資訊的時候都新建乙個物件,同乙個student就不用載入了

每次進儲存頁面的時候執行getinstance載入資訊,儲存的時候就執行getmodelbymodeltype,取出載入的性息.

我滿心歡喜,以為自己在達到需求的同時又兼顧了效率.但是現在看來卻有重大的問題.

我從開始考慮到寫出的**都沒有考慮多執行緒的情況

乙個學生進入了儲存頁面,執行了getinstance,在儲存之前另乙個學生又進來了,重新執行了getinstance,這樣就把上個學生的資訊覆蓋了,最後兩個學生儲存的都是後乙個學生的資訊.

怎麼改呢?

首先想到的是執行緒同步,我把這個類所有的方法都加上synchronized,這個在同乙個時間只能有乙個學生呼叫這個類的方法,其他都得排隊(這裡要把所有的方法都加synchronized,因為鎖是針對class的,乙個執行緒呼叫了這個類中的乙個同步方法,那麼其他執行緒在同一時間不能呼叫任何乙個同步方法).但這也沒對.

因為我把載入資訊和儲存資訊在serviece中放成兩個方法,這樣就算同步了方法也會造成問題.

怎麼辦,1)是把載入資訊和儲存資訊在service中放成乙個方法,這樣就可以用同步來解決問題.

2)是每次getinstance的時候都生成了乙個新的物件,也不會有問題

最終我選擇了第2種,沒錯,效率比較低,不過在這種情況下我也實在想不出兩全其美的辦法,如果誰有更好的方法希望提出來.

總結,在struts1中要特別注意執行緒問題,也就是你編寫的類最好是非可變類,所謂非可變類就是你的方法中不要有各個方法之間共享的變數,如上面的studkey.即使有也要加上final讓它成為唯讀的.

如果不是則很容易產生執行緒問題

關於struts 1 中的執行緒問題

今天突然發現幾個月前寫的 中的乙個執行緒問題.在這裡做個筆記 因為在struts1中在整個web生命週期中,web伺服器只為每個action產生乙個例項,所以就會產生執行緒問題,就必須要編寫執行緒安全的 需求是這樣,簡單的來說我需要儲存乙個學生的一些資訊,但之前我需要載入這個學生相關的一些資訊,資訊...

Struts1 之中類成員變數的執行緒問題

struts1 由於是非執行緒安全的,action中的成員變數 可能是同時使用的。現在記錄下其程式設計模式,供之後參考 公司 中,提供的 service 類全部提供了乙個 getinstance 方法來得到該服務的乙個單例項類。public class productmanagerservice a...

Struts 1 和 Struts 2 的執行緒安全

總的來說,struts1 的 action 是單例模式,因此開發者必須保證它是執行緒安全的或是同步的,因為struts 1中每個action僅有乙個例項來處理所有的請求。struts 2框架在處理每乙個使用者請求的時候,都建立乙個單獨的執行緒進行處理,值棧valuestack也是伴隨著區域性執行緒而...