web應用想要達到完全的線程安全,需要注意哪些地方?

web應用想要達到完全的線程安全,需要注意哪些地方?

關注web安全知識,正好搜到一個前輩在帖子下的答覆,現記錄下來,希望可以在日後用到:

Servlet/JSP技術和ASP、PHP等相比,由於其多線程運行而具有很高的執行效率。Servlet/JSP默認是以多線程模式執行的。做到以下三點,以實現線程安全:
1、實現 SingleThreadModel 接口
  該接口指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那麼在這個Servlet中的service方法將不會有兩個線程被同時執行,當然也就不存在線程安全的問題。如:

          Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
                 …………
          }  

2、同步對共享數據的操作
   使用synchronized 關鍵字能保證一次只有一個線程可以訪問被保護的區段.

3、避免使用實例變量
  本實例中的線程安全問題是由實例變量造成的,只要在Servlet裏面的任何方法裏面都不使用實例變量,那麼該Servlet就是線程安全的。
  但是,如果一個Servlet實現了SingleThreadModel接口,Servlet引擎將爲每個新的請求創建一個單獨的Servlet實例,這將引起大量的系統開銷。SingleThreadModel在Servlet2.4中已不再提倡使用;
  同樣如果在程序中使用同步來保護要使用的共享的數據,也會使系統的性能大大下降。這是因爲被同步的代碼塊在同一時刻只能有一個線程執行它,使得其同時處理客戶請求的吞吐量降低,而且很多客戶處於阻塞狀態。另外爲保證主存內容和線程的工作內存中的數據的一致性,要頻繁地刷新緩存,這也會大大地影響系統的性能。所以在實際的開發中也應避免或最小化 Servlet 中的同步代碼;

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