1. 程式人生 > >多執行緒 —— 多執行緒在WEB開發中的應用相關問題

多執行緒 —— 多執行緒在WEB開發中的應用相關問題

    1. web應用中,要對某一個任務用多執行緒實現,最簡單的程式碼格式是不是必須把要執行的程式碼放在run方法中?

    WEB伺服器會幫你把每個訪問請求開闢一個執行緒,你只要按照你所開發的框架,比如tomcat會讓你利用servlet這個框架來寫程式碼。具體真的一言難盡,反正不用寫到RUN中,除非你想對執行緒控制到極致,例如你要做測試。

2. 部署在伺服器上的一個網站,多個瀏覽器在訪問同一個功能點時,存在多執行緒之說嗎?

多個瀏覽器的意思如果是(無論多臺電腦上還是同一臺電腦上的)多個頁面開啟同一網站的某個功能頁面,那麼如第一個問題所說,每一次訪問(即開啟頁面)都是一個請求,伺服器會為每個請求開闢一個執行緒,就是多執行緒。

3. 多執行緒和併發之間是怎麼一種關係?

多執行緒執行效率就是評判併發效果的好壞,高併發的概念就是在保證資料準確的情況下,減少程序所需操作的時間,特別經典的是頁面訪問伺服器後,讓伺服器去修改資料庫,如果你的資料庫優化做的到位,那麼查詢資料並返回給客戶端的時間將大大減少,我們知道對於一個熱門網站的查詢量是非常大的,然後一個伺服器記憶體可以接收的程序數量也是有限的,這樣一來,我們就說某一時間段內處理執行緒(訪問請求)越多,那麼併發效率就越好了。

4. 對於經典的買票程式,是因為要操作共同資源而是用多執行緒技術,那麼對於一些平常的查詢顯示功能就沒必要用多執行緒技術。對於這裡發起的多個查詢請求,是多個執行緒嗎?

買票程式應用與WEB就應該是多執行緒,共同資源存放在資料庫中,和第三個問題的回答類似,這種商業性的站點更側重於保證資料準確性,有時候我們修改的某項值會影響到別人的查詢與增刪,於是意外情況就產生了,例如在一個A執行緒(使用者)正在修改某項值(買票)的情況下,要減少1張的剩餘票總量是不準確的,因為當這個使用者在方法中對獲得的總剩餘票數的同時(以獲得總剩餘票數,但還未減一),另一個B執行緒(使用者)也進行買票,那麼B獲得的總剩餘票數與A是相同的,因此他們如果同時被允許操作資料庫的公共資源,那麼當兩人都只想完購票的減一操作時,第三執行緒或其他執行緒的查詢剩餘票量將只會看到原本減少2張剩餘量,實際只少了一張,可以想象如果操作的執行緒越多,誤差將會更大。因此資料庫才會有事務,鎖等等概念來提高確保資料準確性前提下的併發效率

    5. 如何解決WEB開發多執行緒搶奪問題 —— synchronized

Java語言的關鍵字,當它用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。

1)當兩個併發執行緒訪問同一個物件object中的這個synchronized(this)同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程式碼塊以後才能執行該程式碼塊。

2)然而,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,另一個執行緒仍然可以訪問該object中的非synchronized(this)同步程式碼塊。

3)尤其關鍵的是,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對object中所有其它synchronized(this)同步程式碼塊的訪問將被阻塞。

4)第三個例子同樣適用其它同步程式碼塊。也就是說,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步程式碼部分的訪問都被暫時阻塞。

5)以上規則對其它物件鎖同樣適用.