Spring MVC 執行緒安全問題的思考

2021-07-16 12:18:55 字數 1394 閱讀 9176

在讀一些博文的時候發現有些文章對springmvc的controller執行緒安全的驗證並不正確,比如沒有**controller執行緒不安全的具體原因,比如將請求執行緒當做controller多例的證明,以下將驗證。

1.request請求執行緒與controllte的關係是什麼?

簡易的驗證方法**

測試結果如下

從列印的日誌可以看出,請求時多執行緒請求的,但是每次請求過來呼叫的controller物件都是乙個,而不是乙個請求過來就建立乙個controller物件

那為什麼說controller是不安全的呢?

原因就在於如果這個controller物件是單例的,那麼如果不小心在類中定義了類變數,那麼這個類變數是被所有請求共享的,這可能會造成多個請求修改該變數的值,出現與預期結果不符合的異常。

接下來將驗證多併發的情況下controller的執行緒不安全的具體表現、通過配置實現controller多例

在單例的情況下 相當於所有類變數對於每次請求都是共享的,每一次請求對類變數的修改都是有效的

}看一下列印的日誌

通過日誌可以看出 變數index為所有請求共享 

那有沒有辦法讓controller不以單例而以每次請求都重新建立的形式存在呢?

答案是當然可以,只需要在類上新增註解@scope("prototype")即可,這樣每次請求呼叫的類都是重新生成的(每次生成會影響效率)

新增@scope("prototype")後我們再看看日誌就會看出區別了

如果我的方法有幫到你,不妨請杯水喝吧?

執行緒安全問題

執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...

執行緒安全問題

是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...

執行緒安全問題

由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....