1. 程式人生 > >如何用Synchronied解決Servlet多執行緒安全問題?

如何用Synchronied解決Servlet多執行緒安全問題?

1.用Synchronied解決多執行緒安全問題:

馬 克-to-win:我們先鋪墊Servlet的多執行緒基礎知識。到現在為止,我們所接觸到的Servlet都是這樣的:第一個人訪問Servlet的時 候,Servlet會被例項化。之後的人再訪問這個Servlet的時候,這個Servlet就不再被例項化了,而是採取執行緒的模式。用每一個由這個 servlet而來的執行緒來應答來請求的客戶。這樣的話,Servlet的例項變數,實際上是被所有客戶的執行緒共享的。這樣就會出現執行緒安全的問題。一談 到多執行緒安全,就需要談到我"Java初級"部分第六章的那個多執行緒安全的例子。這裡基本還是用那個例子,只不過是放在Servlet環境下。那裡對 Critical data(關鍵資料[多個執行緒同時會修改的資料])的解決方案,就是在訪問Critical data的方法前面加上關鍵字Synchronized。這裡建議的解決方案也是這樣。馬克-to-win:我們先看一個沒有加Synchonized的 critical data的例子。見下面例:2.1.1,還是像"Java初級"部分第六章那裡一樣,onlySellOne對於一個人來講,一次只能賣一本書。對於本例 來講,我們用一個瀏覽器模擬一個人。觀察瀏覽器,我們發現,對於有的人(http-8080-Processor25)來講,開始還是18本書,買了一本 書之後(呼叫一次onlySellOne),自己一看,還剩下16本書。這裡顯然出現了問題。問題就在於,有其他人同時也在買書。關鍵資料 (bookNum)可以被多個執行緒同時修改。對於例:2.1.2,我們通過在onlySellOne方法前面加上Synchronized關鍵字,使得這 個方法,在被任何執行緒呼叫時,其他執行緒就不能再呼叫,而只能排隊等候。這樣,結果就完美了。即使兩個瀏覽器是同時執行的,資料也是一個一個減下來的。

詳情請見:http://www.mark-to-win.com/index.html?content=Jsp/jspUrl.html&chapter=Jsp/jsp2_web.html#SynchroniedSolution