關於Servlet的線程安全

    Servlet體系結構是創建在Java多線程機制之上的,它的生命週期是由web容器負責的。當客戶端第一次請求某個servlet時,servlet容器將會根據web.xml的配置實例化這個servlet類;當再有客戶端請求該servlet時,通常不會再實例化該servlet類,servlet容器會採用線程池等技術來支持系統的運行。java

    以上這段意味着,不一樣的url路徑會對應不一樣的servlet類,每一個servlet實例都是運行在多線程環境下的。Servlet的優點也在於多線程、高併發。web

    若是servlet中定義了類成員變量,當多個線程同時訪問該servlet的同一實例時,就會發生多個線程同時訪問和修改該全局變量的狀況。 所以,在sevlet類中,儘可能不要定義類成員變量,而只定義方法級的變量; 在不得不定義全類成員變量的場景,能夠經過synchronized對其加鎖。安全

    若是但願某個servlet實例在同一時間只被一個線程執行,那麼只要讓該Servlet類實現javax.servlet.SingleThreadModel接口便可。 但這種方式天然不適合在高併發場景下使用。session

    另外,HttpSession對象中的屬性也並不徹底是線程安全的。 好比,當用戶屢次打開不一樣頁面,且這些請求都會修改session中的某個屬性,那麼在這個頻繁操做的過程當中,就會發生多個線程同時讀寫session的不安全操做。若是要嚴格控制這種狀況,咱們就須要對該session屬性的讀寫進行synchronized。多線程

相關文章
相關標籤/搜索