OMG,到底在尋找什么..................
          (構造一個完美的J2EE系統所需要的完整知識體系)
          posts - 198,  comments - 37,  trackbacks - 0
          Servlet是在多線程環境下的。即可能有多個請求發給一個servelt實例,每個請求是一個線程。
          struts下的action也類似,同樣在多線程環境下。可以參考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一節: Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets.
          譯:為多線程環境編寫代碼。我們的controller servlet指揮創建你的Action 類的一個實例,用此實例來服務所有的請求。因此,你必須編寫線程安全的Action類。遵循與寫線程安全的servlet同樣的方針。

          1.什么是線程安全的代碼
          在多線程環境下能正確執行的代碼就是線程安全的。
          安全的意思是能正確執行,否則后果是程序執行錯誤,可能出現各種異常情況。

          2.如何編寫線程安全的代碼
          很多書籍里都詳細講解了如何這方面的問題,他們主要講解的是如何同步線程對共享資源的使用的問題。主要是對synchronized關鍵字的各種用法,以及鎖的概念。
          Java1.5中也提供了如讀寫鎖這類的工具類。這些都需要較高的技巧,而且相對難于調試。

          但是,線程同步是不得以的方法,是比較復雜的,而且會帶來性能的損失。等效的代碼中,不需要同步在編寫容易度和性能上會更好些。
          我這里強調的是什么代碼是始終為線程安全的、是不需要同步的。如下:
          1)常量始終是線程安全的,因為只存在讀操作。
          2)對構造器的訪問(new 操作)是線程安全的,因為每次都新建一個實例,不會訪問共享的資源。
          3)最重要的是:局部變量是線程安全的。因為每執行一個方法,都會在獨立的空間創建局部變量,它不是共享的資源。局部變量包括方法的參數變量。
          struts user guide里有:
          Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
          譯:只使用用局部變量。--編寫線程安全的代碼最重要的原則就是,在Action類中只使用局部變量,不使用實例變量。


          總結:
          在Java的Web服務器環境下開發,要注意線程安全的問題。最簡單的實現方式就是在Servlet和Struts Action里不要使用類變量、實例變量,但可以使用類常量和實例常量。如果有這些變量,可以將它們轉換為方法的參數傳入,以消除它們。
          注意一個容易混淆的地方:被Servlet或Action調用的類中(如值對象、領域模型類)中是否可以安全的使用實例變量?如果你在每次方法調用時
          新建一個對象,再調用它們的方法,則不存在同步問題---因為它們不是多個線程共享的資源,只有共享的資源才需要同步---而Servlet和Action的實例對于多個線程是共享的。
          換句話說,Servlet和Action的實例會被多個線程同時調用,而過了這一層,如果在你自己的代碼中沒有另外啟動線程,且每次調用后續業務對象時都是先新建一個實例再調用,則都是線程安全的。

          ===========================================

          以上是我找到令我自己滿意的答案!!!
          “2)對構造器的訪問(new 操作)是線程安全的”
          我想只有這一句話就夠了!!


          非常全面,不錯。

          _________________________________________________________
          對構造器的訪問(new 操作)是線程安全的
          每次調用后續業務對象時都是先新建一個實例再調用,則都是線程安全的

          這是正確的,這只是在Jsp+JavaBeans架構下適用。

          通過new創建對象有很多設計問題,因此,實戰中我們現在基本不通過new來獲得對象。

          既然不通過new獲得對象,那么如何保證Struts線程問題?
          原則就是:
          一個請求一個線程,一個業務對象,一個資源,就象專用通道一樣。
          這里涉及對象多例、單例等復雜問題。
          posted on 2006-06-21 16:31 OMG 閱讀(991) 評論(0)  編輯  收藏 所屬分類: Struts

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風云人物

          文檔

          朋友

          相冊

          經典網站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 沁水县| 明溪县| 肥东县| 美姑县| 卢湾区| 堆龙德庆县| 武宁县| 城市| 松溪县| 普安县| 雅江县| 都江堰市| 星子县| 四会市| 屯留县| 前郭尔| 三台县| 乐至县| 长岭县| 安宁市| 蒙阴县| 教育| 太和县| 唐山市| 南京市| 咸宁市| 鹤庆县| 朔州市| 万年县| 北流市| 墨玉县| 河津市| 吉安县| 龙门县| 崇仁县| 安顺市| 茌平县| 瑞昌市| 阿瓦提县| 寿光市| 满洲里市|