首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts2 線程安全機制解析:為什麼 Action 是線程安全的?

     編輯:Java 相關知識

什麼是線程安全

多線程並發執行同一段代碼時,若每次運行結果與單線程一致,且共享變量值符合預期,則稱線程安全。反之則線程不安全。

Servlet 線程不安全示例

Servlet 默認單例,多請求共享實例變量:

public class ThreadSafeServlet extends HttpServlet {
    private String name; // 共享變量!

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        name = req.getParameter("name");
        Thread.sleep(10000);
        resp.getWriter().print("name=" + name);
    }
}

10 秒內並發訪問 ?name=zhangSan 和 ?name=liSi,兩者輸出均為 name=liSi —— 數據競爭導致錯誤。
解決:將變量移至方法局部,或僅定義 final 不變對象。

Struts2 Action 線程安全原理

Struts2 為每個 HTTP 請求創建一個新的 Action 實例(Prototype 作用域)。

  • Action 實例不共享,屬性隔離,天然無競爭。
  • 與普通 Java 類無異,無需額外同步措施。
  • Spring 整合時需確保 <bean scope="prototype"> 或 @Scope("prototype")。

對比總結

框架實例策略線程安全性應對措施
Servlet單例不安全避免實例變量,用局部變量/ThreadLocal
Struts2每請求一實例安全無需特殊處理
Spring MVC默認單例 Controller不安全同 Servlet,避免實例變量

最佳實踐

  1. Struts2 Action 中放心使用實例字段接收表單參數、存放業務數據。
  2. 若需跨請求共享數據,請顯式使用 Session、Redis 等外部存儲,切勿依賴 Action 實例字段。
  3. 整合 Spring 時檢查 Action Bean 作用域配置,防止誤配為 Singleton 導致線程安全問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved