1. 程式人生 > >Servlet 線程安全

Servlet 線程安全

決定 servlet實例 技術分享 增加 mode 屬性 變量的作用域 引擎 意義

普通類的靜態屬性,當被多個線程訪問時,就有線程安全問題:

技術分享技術分享

Servlet 也一樣

技術分享

當多個客戶端並發訪問同一個Servlet時,web服務器會為每一個客戶端的訪問請求創建一個線程,並在這個線程上調用Servlet的service方法,因此service方法內如果訪問了同一個資源的話,就有可能引發線程安全問題。

  • 如果某個Servlet實現了SingleThreadModel接口,那麽Servlet引擎將以單線程模式來調用其service方法。

  SingleThreadModel接口中沒有定義任何方法(標記接口,只要在Servlet類的定義中增加實現SingleThreadModel接口的聲明即可。

  • 對於實現了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程並發訪問,其采用的方式是產生多個Servlet實例對象,並發的每個線程分別調用一個獨立的Servlet實例對象。
  • 實現SingleThreadModel接口並不能真正解決Servlet的線程安全問題,因為Servlet引擎會創建多個Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題。
  • 事實上,在Servlet API 2.4中,已經將SingleThreadModel標記為Deprecated(過時的)。

解決並發出現的問題,可以采用以下方式:

  • 使用Java同步機制對多線程同步:運行效率低
  • 使用SingleThreadModel接口
  • 合理決定在Servlet中定義的變量的作用域

Servlet 線程安全