Servlet、Struts2以及SpringMvc中的線程安全

Servlet是單例多線程

struts2每次處理一個請求,struts2就會實例化一個對象,這樣就不會有線程安全的問題了。Struts2 是線程安全的,當然前提情況是,Action 不交給 spring管理,並且不設置爲單例。

Spring mvc 線程不安全的原因
請求時多線程請求的,但是每次請求過來調用的Controller對象都是一個,而不是一個請求過來就創建一個controller對象
原因就在於如果這個controller對象是單例的,那麼如果不小心在類中定義了類變量,那麼這個類變量是被所有請求共享的,
這可能會造成多個請求修改該變量的值,出現與預期結果不符合的異常
在單例的情況下 相當於所有類變量對於每次請求都是共享的,每一次請求對類變量的修改都是有效的
那有沒有辦法讓controller不以單例而以每次請求都重新創建的形式存在呢?答案是當然可以,只需要在類上添加註解@Scope("prototype")即可,這樣每次請求調用的類都是重新生成的(每次生成會影響效率)還有其他方法麼?答案是肯定的!使用ThreadLocal 來保存類變量,將類變量保存在線程的變量域中,讓不同的請求隔離開來

注:servlet Struts1 SpringMvc 是線程不安全的,當然如果你不使用實例變量也就不存在線程安全的問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章