Spring 如何保證 Controller 併發的安全

Controller 默認是單例的,一般情況下,如果用Spring MVC 的 Controller時,儘量不在 Controller中使用實例變量。否則會出現線程不安全性的情況,導致數據邏輯混亂。正因爲單例所以不是線程安全的。舉個簡單例子:

@Controller
public class ScopeTestController {
 
    private int num = 0;
 
    @RequestMapping("/testScope")
    public void testScope() {
        System.out.println(++num);
    }
 
    @RequestMapping("/testScope2")
    public void testScope2() {
        System.out.println(++num);
    }
 
}

【1】首先訪問 http://localhost:8080/testScope,得到的答案是1;
【2】然後我們再訪問 http://localhost:8080/testScope2,得到的答案是 2。 此時就不是我們想要的答案,num已經被修改。所有 request都訪問同一個 Controller時,這裏的私有變量就是共用的,也就是說某個 request中如果修改了這個變量,那麼在別的請求中也可讀到這個修改的內容。

【解決辦法】:

【1】不要在 Controller 中定義成員變量;
【2】萬一必須要定義一個非靜態成員變量時候,則通過註解 @Scope(“prototype”),將其設置爲多例模式。
【3】在 Controller 中使用 ThreadLocal 變量;

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