Servlet 線程安全
阿新 • • 發佈:2017-05-19
決定 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 線程安全