1. 程式人生 > >SpringMVC框架並發時出現id變成另外一個用戶id問題

SpringMVC框架並發時出現id變成另外一個用戶id問題

prototype 情況下 type 初始 操作 業務 http 特殊情況 需要

今天測試寫的代碼,出現了在用一個賬戶登錄操作的時候,操作記錄的是另外一個id。

經過查找網上的解決方案確認了問題:在controller裏面定義了一個userid屬性,每次都通過userid傳輸值。然後多線程情況下會同時共享這個userid屬性

解決方案:把controller裏面的屬性刪除,然後用其他方案替代

找到了一篇關於controller單例和多例分析比較好的文章:如下

對於SpringMVC Controller單例和多例,下面舉了個例子說明下. 第一次:類是多例,一個普通屬性和一個靜態屬性。

技術分享

技術分享

結果:普通屬性:0.............靜態屬性:0 普通屬性:0.............靜態屬性:1 普通屬性:0.............靜態屬性:2 普通屬性:0.............靜態屬性:3 所以說:對於多例情況普通屬性時不會共用的,不會產生影響,對於靜態屬性會去共用這個屬性。
第二次:類改為單例

技術分享

結果:普通屬性:0.............靜態屬性:0 普通屬性:1.............靜態屬性:1 普通屬性:2.............靜態屬性:2 普通屬性:3.............靜態屬性:3 所以說:對於單例情況普通屬性和靜態屬性都會被共用。
第三次:類去掉@Scope註解

技術分享

結果:普通屬性:0.............靜態屬性:0 普通屬性:1.............靜態屬性:1 普通屬性:2.............靜態屬性:2 普通屬性:3.............靜態屬性:3 所以說:springmvc默認是單例的。
另外在其他方法裏面打印

技術分享

輸出的結果是

技術分享

跳到別的方法裏面也並不會去取初始值,而是再去共用這個屬性。
最終:盡量不要在controller裏面去定義屬性,如果在特殊情況需要定義屬性的時候,那麽就在類上面加上註解@Scope("prototype")改為多例的模式,以前struts是基於類的屬性進行發的,定義屬性可以整個類通用,所以默認是多例,不然多線程訪問肯定是共用類裏面的屬性值的,肯定是不安全的,但是springmvc是基於方法的開發,都是用形參接收值,一個方法結束參數就銷毀了,多線程訪問都會有一塊內存空間產生,裏面的參數也是不會共用的,所有springmvc默認使用了單例,所以controller裏面不適合在類裏面定義屬性,只要controller中不定義屬性,那麽單例完全是安全的。springmvc這樣設計主要的原因也是為了提高程序的性能和以後程序的維護只針對業務的維護就行,要是struts的屬性定義多了,都不知道哪個方法用了這個屬性,對以後程序的維護還是很麻煩的。 引自:http://blog.csdn.net/qq_27026603/article/details/67953879 作者:劉超軍的博客

SpringMVC框架並發時出現id變成另外一個用戶id問題